5

[FaultContract(typeof(ExceptionDetail))]操作コントラクトの属性を入れました。サービスをクライアント アプリケーションに追加しようとすると、次のエラーが発生します -"Custom tool error: Failed to generate code for the service reference 'ServiceReference1'. Please check other error and warning messages for details."

しかし、FaultContract 属性をコメント アウトすると、クライアント アプリに wcf サービス参照を追加できます。

4

4 に答える 4

9

FaultContracts を持つことのポイントは、サーバーとクライアントの間の通信チャネルを切断しない (.NET 例外などのエラー状態を適切かつ相互運用的に処理する) サービスからまず SOAP フォールトを返すことができるようにすることです。 FaultContracts を使用すると、サーバーは型指定されたフォールト ( FaultException<T>) をスローし、クライアントはそれらをキャッチできます。

本当に相互運用できるようにしたい、または必要がある場合は、次のことを行う必要があります。

  • すべての FaultContract タイプを [DataContract] 属性で装飾されたクラスとして定義します
  • サーバー上のすべての .NET 例外を (IErrorHandler インターフェイスなどを使用して) キャッチし、それらを相互運用可能な SOAP エラーに変換します。

ワイヤの両端を制御し、両端が .NET である場合、これを 1 つのステップで単純化できます。サーバー上で、すべての .NET 例外を処理し、それらを egFaultException<ArgumentOutOfRangeException>に変換します。つまり、"fault of (whatever . NET 例外)」を呼び出してから、クライアントで、型指定された FaultException をキャッチして処理します。

[FaultContract(typeof(ArgumentOutOfRangeException)]
[OperationContract]
public void CallService(.......)

次に、実装でこれを使用します。

try
{
    clientProxy.CallService();
}
catch(FaultException<ArgumentOutOfRangeException> ex)
{
   // handle the most specific exception first
}
catch(FaultException ex)
{
   // handle all other, unspecific server faults
}
catch(CommunicationException ex)
{
   // handle all other, client-proxy related WCF errors
}
catch(Exception ex)
{
   // handle anything else....
}
于 2010-03-18T22:18:56.607 に答える
2

それを削除しFaultContract、代わりに構成しますincludeExceptionDetailInFaults

  <system.serviceModel>
    <behaviors>
      <serviceBehaviors>
        <behavior name="Behavior">
          <serviceDebug includeExceptionDetailInFaults="true"/>
        </behavior>
      </serviceBehaviors>
    </behaviors>
  </system.serviceModel>
于 2010-03-18T17:27:59.430 に答える
0

アクティビティ トレースを表示するには、http://msdn.microsoft.com/en-us/library/ms732023.aspxのService Trace Viewer ツールを使用します。

于 2010-03-18T17:24:33.373 に答える
0

私は数分前に同じ問題を抱えていました。これは、デフォルトのコンストラクターが存在しないことが原因でした。また、すべてのプロパティには public get/set アクセサーが必要であることにも注意してください。

于 2011-02-15T09:15:01.527 に答える