Вернуть уже сериализованный тип в WCF - PullRequest
5 голосов
/ 26 мая 2011

Я бы хотел использовать WCF для настройки кроссплатформенного WebService.Проблема - на самом деле больше проблема производительности - это то, что я хотел бы вернуть Type (скажем, Event), и у меня это событие уже есть в XML.Поэтому я хотел бы избежать десериализации в Event, а затем WCF сериализует его обратно в XML.Есть идеи, как с этим справиться?Я хочу добиться чего-то вроде «WCF, этот метод возвращает объект Event, но я уже его сериализовал в XML, поэтому возьмите его и не заставляйте меня сначала десериализовать его, чтобы вы могли снова его сериализовать».

Даниэль

Ответы [ 3 ]

1 голос
/ 26 мая 2011

Я думаю, вы должны использовать класс Message для запроса и ответа на сервис вместо определения DataContract: это должно дать вам больше контроля над структурой сообщений SOAP. Однако, если вы пойдете по этому пути, вам нужно будет создать собственный прокси ( см. Здесь для начала).

1 голос
/ 26 мая 2011

Компонентом WCF, который выполняет (де) сериализацию сообщений, является MessageFormatter.

Следовательно, вы можете предоставить пользовательский IDispatchMessageFormatter.В методе SeralizeReply() (который возвращает Message) вы можете использовать перегрузку Message.CreateMessage(), которая принимает XmlReader, и предоставить XmlReader, который вы создаете из своего XML.И это все.Хотя немного работы.Вам нужно решить, стоит ли это того.

0 голосов
/ 26 мая 2011

Я не знаю ни одного способа сделать это. Если ваш Event большой, этот дополнительный шаг , вероятно, не повредит вам, и, по крайней мере, он локальный - и если он имеет значение , ваша основная проблема - пропускная способность. , который будет одинаковым в любом случае.

Вы можете выставить данные как XmlElement в сообщении, что позволит избежать этого шага - но тогда вызывающим абонентам необходимо знать, чтобы распознать их как Event (поскольку все, что они увидят в mex / wsdl, это кусок блуждающих X).

В конечном счете, одна из причин, по которой он это делает, заключается в том, что WCF - это модель на основе , и сериализатор может на самом деле поменяться множеством приемов - так что с точки зрения обычной модели WCF факт то, что у вас есть xml, не имеет значения: это может на самом деле не быть чем-то вроде того, что происходит по проводу. Ему нужен объект, чтобы он мог попросить фактический сериализатор выполнить эту работу.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...