Как отправлять пользовательские объекты в сообщении WCF

#c# #wcf #client-server #message

#c# #wcf #клиент-сервер #Сообщение

Вопрос:

Я хотел отправить один пользовательский объект system.servicemodel.Channels.Message . Нравится

 public class person
{
    string Id;
    string Name;
}

MessageVersion mv = MessageVersion.Create(Soap12);
String action = "Msg";

Message msg = Message.Create(mv, action, new person());

serviceref.ProcessMsg(msg) // this is my service reference in client

//when i tried to access this in Service like 
person p = msg.GetBody<person>()
//I am getting an serialization exception
//I have the Person class on both client and service side
 

Может ли кто-нибудь, пожалуйста, помочь мне разобраться в моей ошибке?

Ответ №1:

Похоже, вы ищете DataContract:

 using System.Runtime.Serialization;

[DataContract]
public class person
{
    [DataMember]
    string Id;

    [DataMember]
    string Name; 
}
 

Дополнительные сведения о DataContracts и WCF см. в разделе Использование контрактов данных.

Редактировать

Не уверен, поможет это или нет, но, как я отметил в своем ответе на ваш комментарий, существует перегрузка метода createMessage, который принимает XmlObjectSerializer. Документы MSDN на нем довольно тонкие, но я думаю, что что-то вроде этого может это сделать:

 Message msg = Message.Create(mv, action, new person(), new DataContractSerializer(typeof(person)));
 

Я не тестировал это, но, по крайней мере, это может направить вас в правильном направлении.

Необходимо DataContractSerializer будет предоставить DataContract ( person в первой части моего ответа).

Комментарии:

1. Эй, я попробовал это, но ввод и вывод для моего сервисного контракта — это только System. ServiceModel. Канал. Сообщение. Поскольку человек не является непосредственным источником информации, я думаю, это мне не поможет.

2. @realn — Что, если вы использовали один из альтернативных методов createMessage — есть один, который принимает четвертый параметр для XmlObjectSerializer: Message. Метод createMessage (MessageVersion, String, Object, XmlObjectSerializer)

3. Ошибка в строке 1 позиция 695. Ожидание элемента ‘Person’ из пространства имен ‘ schemas.datacontract.org/2004/07/DCS ‘.. Встречается ‘Элемент’ с именем ‘строка’, пространство имен ‘ schemas.microsoft.com/2003/10/Serialization «.

4. Это сообщение, которое я перехватил SerializationException.

5. @realn — вы украсили класс Person [DataContract] атрибутом и полями [DataMember] ? Судя по пространствам имен в ошибке, похоже, что у вас их может и не быть.