私は WCF Web サービスを開発しており、mvc2 アプリケーション内でそれを使用しています。私の問題は、カスタムの FaultDetail を使用してメソッドで FaultContracts を使用していて、多くの場合に faultexception をスローしていますが、クライアントが例外を受け取ると、サービス側からスローした FaultException ではなく、通常の SoapException を受け取ることです。
ここにいくつかのコードがあります:
カスタム障害詳細クラス:
[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 をキャッチすることです。代わりに、キャッチがスキップされ、次のキャッチが 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>
助けはありますか?
前もって感謝します
よろしく
アレッサンドロ