WCF Webservices和FaultContract - 客户端接收SoapExc而不是FaultException <detail> </details>

时间:2010-04-15 09:49:09

标签: wcf exception soap fault

我正在开发一个WCF Web服务并在mvc2应用程序中使用它。 我的问题是我使用自定义FaultDetail在我的方法上使用FaultContracts,并且我正在忠实地抛出错误,但是当客户端收到异常时,它会收到正常的SoapException而不是我从服务端抛出的FaultException。 / p>

以下是一些代码:

自定义故障详细信息类:

[DataContract]
public class MyFaultDetails
{
[DataMember]
public string Message { get; set; }
}

服务合约的运作:

[OperationContract]
[FaultContract(typeof(MyFaultDetails))]
void ThrowException();

实现:

public void ThrowException()
{
var details = new MyFaultDetails { Message = "Exception Test" };
throw new FaultException<MyFaultDetails >(details , new FaultReason(details .Message), new FaultCode("MyFault"));
}

客户方:

try
{
// Obv proxy init etc..
service.ThrowException();
}
catch (FaultException<MyFaultDetails> ex)
{
// stuff
}
catch (Exception ex)
{
// stuff
}

我期望捕获FaultException,而不是跳过catch,下一次捕获带有SoapException类型的异常。

我错过了什么吗?

我在wcf中使用了faultcontracts的很多线索,我所做的似乎很好。 我看了一下生成的wsdl和xsd,它们看起来很好。这是关于这种方法的片段:

 <wsdl:operation name="ThrowException">
      <wsdl:input wsaw:Action="http://tempuri.org/IAnyJobService/ThrowException" message="tns:IAnyJobService_ThrowException_InputMessage" />
      <wsdl:output wsaw:Action="http://tempuri.org/IAnyJobService/ThrowExceptionResponse" message="tns:IAnyJobService_ThrowException_OutputMessage" />
      <wsdl:fault wsaw:Action="http://tempuri.org/IAnyJobService/ThrowExceptionMyFaultDetailsFault" name="MyFaultDetailsFault" message="tns:IAnyJobService_ThrowException_MyFaultDetailsFault_FaultMessage" />
    </wsdl:operation>

<wsdl:operation name="ThrowException">
      <soap:operation soapAction="http://tempuri.org/IAnyJobService/ThrowException" style="document" />
      <wsdl:input>
        <soap:body use="literal" />
      </wsdl:input>
      <wsdl:output>
        <soap:body use="literal" />
      </wsdl:output>
      <wsdl:fault name="MyFaultDetailsFault">
        <soap:fault use="literal" name="MyFaultDetailsFault" namespace="" />
      </wsdl:fault>
    </wsdl:operation>

任何帮助?

提前致谢

此致

的Alessandro

1 个答案:

答案 0 :(得分:3)

好的家伙,我自己解决了。 正如我所说,一切都是正确的......我只是使用了错误的httpBinding(基本而不是ws)。 如果你不使用wsHttpBinding,那么所有漂亮的FaultContract机制都无法正常工作。

全部谢谢

此致

的Alessandro