从WCF客户端消耗非wcf SOAP错误(定义了soap fault)

我有一个非Wcf服务器,我从WCF客户端调用,我需要访问已注册的soap故障,如果服务器抛出它(它包含我需要用户的反馈)。 我使用了如何从WCF客户端访问SOAP 1.1故障详细信息中的示例(没有错误契约),但是给出了一个痛苦,我确实在wsdl中定义了错误契约,至少每个SOAP规范,并且错误包含错误代码和错误字符串。

  ...        ...    ...       ... 

服务导入可以正确识别所有这些并生成正确的代码构造:

 [System.Runtime.Serialization.DataContractAttribute(Name="BtsSoapException", Namespace="http://www.cisco.com/BTS10200/i01")] [System.SerializableAttribute()] public partial class BtsSoapException : object ... .... [System.ServiceModel.ServiceContractAttribute(Namespace="http://www.cisco.com/BTS10200/i01", ConfigurationName="CiscoBTSService.Bts10200Operations")] public interface Bts10200Operations { [System.ServiceModel.OperationContractAttribute(Action="", ReplyAction="*")] [System.ServiceModel.FaultContractAttribute(typeof(TestCiscoBTS.CiscoBTSService.BtsSoapException), Action="", Name="fault")] TestCiscoBTS.CiscoBTSService.loginResponse login(TestCiscoBTS.CiscoBTSService.loginRequest request); ... 

当我使用无效帐户调用login() ,我会根据wsdl获得正确的响应:

     soapenv:Server.generalException    401 java.lang.Exception: No user profile defined in the database for fakeuser  com.sswitch.oam.soap.intf.BtsSoapException  at com.sswitch.oam.soap.impl.UserAuth.validateUser(UserAuth.java:63) ... 

FaultExcpetion会触发,但是它的空白( Message =“”)并且我没有看到任何暴露BtsSoapException实例的属性。 就像它没有被反序列化一样(即使wcf知道它需要做的一切)。 我究竟做错了什么? 如何让WCF给我FaultException

如果您尝试过类似下面显示的代码,则需要捕获具有您正在查找的信息的特定soap fault合约。 这篇MSDN文章中的信息应该有所帮助。

 var proxy = new WhatEverYourServiceProxyClassIsNamed(); try { //your call logic here proxy.Close(); } catch (FaultException bse) { //Get the info you're looking for in the strongly typed soap fault: proxy.Abort(); } catch (FaultException fe) { //Do something appropriate for a non-typed soap fault proxy.Abort(); } finally { if ((ICommunicationObject)proxy).State != CommunicationState.Closed) proxy.Abort(); } 

我认为Sixto Saez是对的。 您可以在FaultException中看到BtsSoapException实例。

定义:

       

响应:

   401 java.lang.Exception: No user profile defined in the database for fakeuser 

如果你这样做

 catch (FaultException bse) { console.write(bse.Detail.error_string) } 

在调试时,必须在输出窗口中看到“java.lang.Exception:数据库中没有为fakeuser定义用户配置文件”。