我正在写一个简单的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>
任何人都可以帮我弄清楚我该怎么做?
感谢。
答案 0 :(得分:4)
WCF IS 基于SOAP的消息服务 - 所以你得到的“大块肥皂消息”实际上是“按照设计”,真的!
但究竟是什么问题? SOAP是一个定义明确的协议,每个体面的Web服务平台都会说和理解SOAP。
另外,通常情况下,在WCF中,您不会处理“原始”消息 - 您定义了服务和客户端交换的数据结构,您将类定义为来回发送的[DataContract]
,并且让WCF和SOAP处理从XML到XML的序列化和反序列化消息的所有细节。通常情况下,您根本不需要处理任何这些问题。
再一次:这里真正的挑战或问题是什么? WCF是SOAP(现在也是REST) - 那么为什么SOAP消息会让您感到惊讶或导致问题?
WCF还支持处理“原始”消息,它允许您执行诸如从SOAP消息中提取正文等内容(或者以其他方式调整它)。请参阅其中一些博客文章,了解可能的内容以及您可以做的事情: