0

私は 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>

助けはありますか?

前もって感謝します

よろしく

アレッサンドロ

4

1 に答える 1

3

わかりました、自分で解決しました。私が言ったように、すべてが正しかった...私は間違ったhttpBinding(基本的でwsではない)を使用していました。wsHttpBinding を使用しないと、すべての美しい FaultContract メカニズムが機能しません。

どうもありがとう

よろしく

アレッサンドロ

于 2010-04-15T11:32:55.433 に答える