我必须使用SOAP使用第三方Web服务。很容易让它与WCF一起工作,但现在我遇到了SOAP故障的问题。该服务向我发送了一个不正确的SOAP错误:
<?xml version="1.0" encoding="utf-8" ?>
<SOAP-ENV:Envelope
SOAP-ENV:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"
xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/">
<SOAP-ENV:Body>
<SOAP-ENV:Fault>
<SOAP-ENV:faultcode>14</SOAP-ENV:faultcode>
<SOAP-ENV:faultstring>Unknown Function</SOAP-ENV:faultstring>
</SOAP-ENV:Fault>
</SOAP-ENV:Body>
</SOAP-ENV:Envelope>
错误是<faultcode>
必须没有命名空间:
System.ServiceModel.CommunicationException : Server returned an invalid
SOAP Fault. Please see InnerException for more details.
----> System.Xml.XmlException : Start element 'faultcode' from namespace
'' expected. Found element 'SOAP-ENV:faultcode' from namespace
'http://schemas.xmlsoap.org/soap/envelope/'.
我无法更改原始的Web服务 - 但是我可以使用WCF中的任何内容以某种方式处理这些错误消息而不会始终获得CommunicationException
吗?
答案 0 :(得分:12)
是的,但它并不完美。请参阅此论坛帖子底部的消息检查器代码:
http://social.msdn.microsoft.com/Forums/en-US/wcf/thread/435850aa-bf74-4158-a29a-256135207948
基本上,您可以接收传入的消息并对其进行更改,以便WCF可以处理它。
答案 1 :(得分:-1)
我相信老式的System.Web.Services.SoapHttpClientProtocol类比WCF System.ServiceModel.Channels.ServiceChannel.HandleReply / System.ServiceModel更能容忍不符合鼻烟或标准的错误。 Channels.MessageFualt.CreateFault。
FWIW。