【问题标题】:Prevent WCF client from deserializing防止 WCF 客户端反序列化
【发布时间】:2011-01-08 04:42:05
【问题描述】:

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

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

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

【问题讨论】:

    标签: .net wcf performance serialization


    【解决方案1】:

    您究竟想在哪里处理您想要的消息部分?一般来说,在我看来,您并不真正希望生成默认客户端代理,最好使用自己的自定义客户端代理。

    如果你能走这条路,一个可用的选择是简单地让代理返回一个Message 对象而不是一个真正的 DataContract,然后你可以自己轻松地从 SOAP 主体中读取原始 XML,然后解析它。比试图弄乱序列化程序更容易,恕我直言。

    【讨论】:

    • 自定义客户端代理似乎是个好主意。如果我要创建自己的代理,您对从哪里开始有任何指示吗?
    • 真的没什么难的。基本上像定义服务一样定义合同接口(只需确保所有名称/命名空间匹配)并添加方法。然后创建一个派生自 ClientBase 的类(任何 svcutil 生成的代码都会给你一个提示,这很容易)。 Dmitry 关于如何使用 Message 类的回答很好,但我要补充一点,您不需要将它用于输入和输出......如果您愿意,您仍然可以将 DataContracts 用于请求消息。
    • 这些是帮助我入门的有用技巧。非常感谢!
    【解决方案2】:

    从定义客户端 ServiceContract 开始,操作如下

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

    然后使用generic ClientFactory 实例化代理。

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

    【讨论】:

      【解决方案3】:

      我已经在博客中介绍了我最终得到的确切解决方案。所以,为了完整性:

      【讨论】:

        猜你喜欢
        • 2020-03-16
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-09-19
        • 2011-03-23
        • 2018-11-30
        相关资源
        最近更新 更多