【问题标题】:Altering a SOAP message before deserialization在反序列化之前更改 SOAP 消息
【发布时间】:2017-03-06 18:56:42
【问题描述】:

由于信封无效,我无法拦截响应消息。不幸的是,WCF 抛出异常“无法识别的消息版本”。在调用 AfterReceiveReply 之前,我没有机会更正响应 XML。是否有较低级别(或不同)的调用可以用来拦截流并更正此 XML,或者是否有更好的方法来处理响应,即 CustomBinding?

我已经尝试过 IClientMessageInspector AfterReceiveReply 和 IOperationBehavior 但这些行为都是在抛出异常后调用的。

这是响应的样子。

<ENVELOPE>
    <HEADER>
        <ERROR_CODE>955</ERROR_CODE>
        <ERROR_DESC>XML Parsing Failed: test:1:74 error:  value '1231231230' does not match regular expression facet '\d{19,20}'</ERROR_DESC>
        <ASYNCH_RESPONSE_INDICATOR>0</ASYNCH_RESPONSE_INDICATOR>
    </HEADER>
    <BODY>
        <MY_METHOD_RESPONSE></MY_METHOD_RESPONSE>
    </BODY>
</ENVELOPE>

【问题讨论】:

标签: c# wcf soap deserialization


【解决方案1】:

您尝试调用的服务不是 SOAP 服务。它看起来像一个老式的POX Web 服务,在这种情况下,您可以通过两种方式使用它。

  1. 使用 WCF POX 客户端,或
  2. 使用HttpWebRequst

要使用 WCF,请参阅 herehere。您的问题是这些服务风格现在被认为是非正统的,因此 WCF 的更高版本可能不再支持它们。

另一方面,虽然 .net 仍然支持 HttpWebRequest,但它的使用很繁琐,没有被广泛使用。它确实有一个名为WebClient 的高级包装器,它更易于使用,但它可能无法为您提供所需的控制级别。

我当然会先调查第二个选项。 WCF 中对 POX 服务的支持是在 2008 年通过 REST Toolkit 引入的,这是 Microsoft 首次涉足 SOAP 服务之外的世界(尽管有 .net 远程处理),因此已经过时了。

【讨论】:

    猜你喜欢
    • 2016-03-31
    • 1970-01-01
    • 2021-02-06
    • 2011-09-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-05-19
    相关资源
    最近更新 更多