在反序列化之前更改SOAP消息

时间:2017-03-06 18:56:43

标签: c# wcf soap deserialization

由于信封无效,我无法拦截回复消息。不幸的是,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>

1 个答案:

答案 0 :(得分:1)

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

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

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

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