Как я работаю напрямую с XML в контрактах сообщений WCF? - PullRequest
1 голос
/ 08 сентября 2010

Я работаю с WCF, внедряя очень (ОЧЕНЬ) сложный набор взаимодействий (который мы передали комитету, контролируемому людьми, которые никогда не слышали о компьютерах) через SOAP.Я получу сообщение, которое выглядит следующим образом:

<s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/">
 <s:Header>
  ... (lots of "standard" stuff that noone has ever dared
       to cobble together in such non-standard ways before)
 </s:Header>
 <s:Body>
  <MyIncrediblyComplexXmlElement>
   ...
  </MyIncrediblyComplexXmlElement>
 </s:Body>
</s:Envelope>

... и я НЕ хочу анализировать содержимое тела в объектную модель, созданную xsd.exe или svcutil.exe (независимо от того, является ли онаэти инструменты могли бы даже создать объектную модель, которая могла бы успешно сериализовать / десериализовать этот конкретный XML - вопрос энергичных дебатов).Я планирую создать Message Contract для реализации этих сервисов, и мне интересно, могу ли я сделать что-то похожее на следующее:

[ServiceContract(Namespace = "mynamespace")]
public interface IMyServiceInterface
{
 [OperationContract(Action = "requestaction", ReplyAction = "replyaction")]
 MyResponseMessage MyMethod(MyRequestMessage request);
}

[MessageContract(IsWrapped = false)]
public class MyRequestMessage
{
 [MessageBodyMember(Namespace = "mynamespace", Order = 0)]
 public XmlElement MyIncrediblyComplexXmlElement { get; set; }
}

[MessageContract(IsWrapped = false)]
public class MyResponseMessage
{
 [MessageBodyMember(Namespace = "mynamespace", Order = 0)]
 public XmlElement SomeResponseXmlElement { get; set; }
}

... и затем манипулировать XMLнепосредственно, что входит и выходит в сообщениях запроса и ответа.Это значительно упростит разработку, поскольку мне приходится работать только с небольшим подмножеством XML, которое может отображаться в сообщениях, и я могу работать с ними более просто, чем сгенерированная объектная модель.

Будет ли этот шаблон (использования XmlElement в Контрактах на сообщения) работать для моих целей?Если нет, то как я могу достичь цели работы напрямую с XML, но без необходимости работать с Message объектами напрямую?

Ответы [ 2 ]

1 голос
/ 08 сентября 2010

Возможна работа с XmlElement или XElement. Он поместит xsd: any в сгенерированные описания сообщений в WSDL. Если вы хотите избежать сериализации и десериализации объектов, это путь, но в этом случае может прийти любой XML. Другая возможность - напрямую работать с типом сообщения, но вы уже отклонили его.

0 голосов
/ 08 сентября 2010

Вы можете написать инспектор сообщений и подключить его к среде выполнения WCF, чтобы манипулировать XML-сообщением до его отправки на сервер или при получении на стороне сервера.

Ознакомьтесь с документами MSDN для инспекторов сообщений или с блогом Пабло Пиалорси , где приведены дополнительные советы. Временами все становится довольно сумбурно и беспорядочно - но среда исполнения WCF действительно предлагает вам необходимые возможности. Это приятно и просто? Наверное, нет - но, по крайней мере, это возможно, и задокументировано тоже!

...