#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]
? Судя по пространствам имен в ошибке, похоже, что у вас их может и не быть.