有一个我必须与之交互的外部 SOAP 服务。
为此我打开VisualStudio,右键单击References,单击“添加服务引用”,输入WSDL 文档的地址并单击“确定”。这行得通,VisualStudio 为我生成了一个库 - 一个 WCF 客户端 - 可用于与上述外部 API 进行交互。
唯一的问题是有时我会收到System.ServiceModel.CommunicationException: Unrecognized message version.
Fiddler 向我展示了原因。这是服务器的响应:
<h1>CException</h1>
<p>A non-numeric value encountered</p>
好吧,这绝对不是 SOAP 响应,难怪 .NET 拒绝解析它。但在这种情况下,我可以检索原始响应吗? (也许从 HTML 标签中检索错误并将其显示给用户是有意义的)
我的尝试:我从 Microsoft 文档中阅读了这篇文章:How to: Inspect or Modify Messages on the Client 它说:
<块引用>System.ServiceModel.Dispatcher.IClientMessageInspector
接口。System.ServiceModel.Description.IEndpointBehavior
或 System.ServiceModel.Description.IContractBehavior
。 System.ServiceModel.Description.IEndpointBehavior
允许您在端点级别更改行为。 System.ServiceModel.Description.IContractBehavior
允许您在合同级别更改行为。ClientBase<TChannel>.Open
调用 ICommunicationObject.Open
或 System.ServiceModel.ChannelFactory<TChannel>
方法之前插入行为。有关详情,请参阅Configuring and Extending the Runtime with Behaviors。(这也是 this SO answer 建议的)
我尝试了 IContractBehavior
和 IEndpointBehavior
。不幸的是,结果是相同的:CommunicationException
在调用我的自定义行为之前 被抛出,因此我无法获得原始响应。 (如果响应是 SOAP 消息,则不会抛出异常,调用我的行为,我可以获得原始响应,但在这种情况下,我对它不感兴趣:()>
有没有办法获得原始响应,即使它不是 SOAP 消息?