带有消息序列化的WCF

时间:2010-01-08 21:08:28

标签: wcf serialization xml-serialization

我正在写一个简单的wcf服务,它将请求提交给某个要处理的网关。

通过执行类似的操作来执行请求:

我正在编写一个WCF服务,该服务向某些服务提交请求,这些服务希望得到类似的内容:

gatewayService.SendRequest(request);

其中gatewayService是WCF代理,请求是我自己的对象,它继承WCF消息对象。

请求对象具有以下几个属性:

[MessageBodyMember]
public ReportCommandLineRequest ReportRequest { get; set; }

[MessageBodyMember]
public ImportCommandLineRequest ImportRequest { get; set; }

我的问题是这个请求对象被序列化了。在服务器端,我收到一条看起来像这样的大块肥皂消息:

<s:Envelope xmlns:s="http://www.w3.org/2003/05/soap-envelope" 
            xmlns:a="http://www.w3.org/2005/08/addressing">
   <s:Header>
      <a:Action s:mustUnderstand="1">http://tempuri.org/IReportClient/RunReport/IGatewayAdapter/SendRequest</a:Action>
      <VsDebuggerCausalityData xmlns="http://schemas.microsoft.com/vstudio/diagnostics/servicemodelsink">uIDPo4jiWNjcsdxHiUhlOA63xYEAAAAApgt+BuVvcEixP33+yOQTgRHZQSyr4L5ImMHVeEWLFBMACQAA</VsDebuggerCausalityData>
      <a:To s:mustUnderstand="1">net.tems://localhost:7222/queue/LB.FIA.Gateway.STAGE.InputQueue</a:To>
   </s:Header>
   <s:Body>
      <SendRequest xmlns="http://tempuri.org/IReportClient/RunReport">
          <request xmlns:b="http://schemas.datacontract.org/2004/07....

另一方面,我希望在服务器端只获得上面列出的属性的序列化(ReportRequest / ImportRequest),并希望得到一个序列化的xml看起来像那样(没有所有的垃圾:

<ReportCommandLineRequest>
  <outputFileName>gatewayReportOutput-01082010-150043.pdf</outputFileName>
  <CommandLineArg
    name="format"
..
</ReportCommandLineRequest>

任何人都可以帮我弄清楚我该怎么做?

感谢。

1 个答案:

答案 0 :(得分:4)

WCF IS 基于SOAP的消息服务 - 所以你得到的“大块肥皂消息”实际上是“按照设计”,真的!

但究竟是什么问题? SOAP是一个定义明确的协议,每个体面的Web服务平台都会说和理解SOAP。

另外,通常情况下,在WCF中,您不会处理“原始”消息 - 您定义了服务和客户端交换的数据结构,您将类定义为来回发送的[DataContract],并且让WCF和SOAP处理从XML到XML的序列化和反序列化消息的所有细节。通常情况下,您根本不需要处理任何这些问题。

再一次:这里真正的挑战或问题是什么? WCF是SOAP(现在也是REST) - 那么为什么SOAP消息会让您感到惊讶或导致问题?

WCF还支持处理“原始”消息,它允许您执行诸如从SOAP消息中提取正文等内容(或者以其他方式调整它)。请参阅其中一些博客文章,了解可能的内容以及您可以做的事情: