Or *_*r A 0 wcf serialization xml-serialization
我正在编写一个简单的 wcf 服务,将请求提交给某个网关进行处理。
正在通过执行以下操作来执行请求:
我正在编写一个 WCF 服务,该服务将请求提交给一些期望得到如下内容的服务:
gatewayService.SendRequest(request);
Run Code Online (Sandbox Code Playgroud)
其中 gatewayService 是 WCF 代理,请求是我自己的对象,它继承了 WCF Message 对象。
请求对象有几个属性,如:
[MessageBodyMember]
public ReportCommandLineRequest ReportRequest { get; set; }
[MessageBodyMember]
public ImportCommandLineRequest ImportRequest { get; set; }
Run Code Online (Sandbox Code Playgroud)
我的问题是当这个请求对象被序列化时。在服务器端,我收到了一条看起来像这样的大块肥皂消息:
<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....
Run Code Online (Sandbox Code Playgroud)
另一方面,我希望在服务器端只得到上面列出的属性的序列化(ReportRequest/ImportRequest),并希望得到一个序列化的 xml 看起来像这样(没有里面的所有垃圾:
<ReportCommandLineRequest>
<outputFileName>gatewayReportOutput-01082010-150043.pdf</outputFileName>
<CommandLineArg
name="format"
..
</ReportCommandLineRequest>
Run Code Online (Sandbox Code Playgroud)
谁能帮我弄清楚我该怎么做?
谢谢。
WCF是一个基于 SOAP 的消息服务 - 所以你得到一个“大块的肥皂消息”的事实有点“设计”,真的!
但真正的问题是什么??SOAP 是一个定义明确的协议,每个像样的 Web 服务平台都会说和理解 SOAP。
另外,通常,在 WCF 中,您无论如何都不处理“原始”消息 - 您定义服务和客户端交换的数据结构,定义[DataContract]
来回发送的类,并让 WCF 和 SOAP 处理所有将消息从 XML 序列化和反序列化到 XML 的细节。通常,您根本不需要处理任何这些。
所以再一次:这里真正的挑战或问题是什么?WCF 是 SOAP(现在也是 REST) - 那么为什么该 SOAP 消息会让您感到惊讶或导致问题?
WCF 还支持处理“原始”消息,它允许您执行诸如从 SOAP 消息中提取正文等(或以其他方式对其进行调整)的操作。请参阅其中一些博客文章,了解有关可能的操作和您可以执行的操作的一些指示: