我正在开发一个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
答案 0 :(得分:3)
好的家伙,我自己解决了。 正如我所说,一切都是正确的......我只是使用了错误的httpBinding(基本而不是ws)。 如果你不使用wsHttpBinding,那么所有漂亮的FaultContract机制都无法正常工作。
全部谢谢
此致
的Alessandro