2010-01-22 123 views
3

我有一个WCF客户端代理从SOAP Web服务读取。我不控制服务,只控制客户端代理。调用服务的一个操作的结果被定义为非常大的XML模式,其中只有一小部分与我的应用程序相关。防止WCF客户端反序列化

我创建了一个自定义的WCF行为,它允许我解析原始XML响应并只读取相关部分。但是,代理仍然将响应反序列化为对象图(由于XML模式而非常复杂)。就我的申请而言,最后一步是多余的。

是否有可能阻止我的WCF客户端代理执行反序列化响应的最后一步?

回答

2

你究竟在哪里处理你想要的消息部分?总的来说,听起来像你并不真的想要生成默认的客户端代理,并且用自己的自定义客户端代理更好。

如果你可以走这条路线,一个可用的选项是简单地让代理返回一个Message对象而不是真正的DataContract,然后你可以很容易地从SOAP体中自己读取原始XML并解析它。比试图混淆序列化程序,imho更容易。

+0

定制的客户端代理,似乎是个好主意。如果我要创建我自己的代理,你有什么指示从哪里开始? – 2010-01-22 12:36:07

+0

这真的没什么难的。基本上像定义服务一样定义你的契约接口(只要确保所有名称/命名空间匹配)并添加方法即可。然后创建一个从ClientBase 派生的类(任何svcutil生成的代码都会给你一个提示,这很容易)。 德米特里如何使用Message类的答案很好,但我会补充说您不需要将它用于输入和输出......如果您喜欢,仍可以使用DataContracts作为请求消息。 – tomasr 2010-01-22 18:19:12

+0

这些是有用的提示,这将使我开始。非常感谢! – 2010-01-25 07:10:22

2

开始与限定客户端的ServiceContract与操作等

[OperationContract(Action="YourAction", ReplyAction="YourResponseAction")] 
Message YourMethod(Message request) 

然后使用generic ClientFactory实例代理。

您必须手动构建请求消息并使用单向阅读器解析响应。