Web サービス記述言語 (WSDL) のサービス操作の説明に追加される 1 つ以上の特定の例外条件を、操作によって返される明示的な SOAP エラー メッセージとして宣言する FaultContractAttribute 属性を使用して、操作にマークを付けます。
すべてのマネージ アプリケーションで、操作エラーは Exception オブジェクトにより表されます。Windows Communication Foundation (WCF) アプリケーションなどの SOAP に基づくアプリケーションでは、サービス メソッドは SOAP エラー メッセージを使用して操作エラー情報を通知します。WCF アプリケーションは、両方の型のエラー システムで実行されるため、クライアントに送信する必要があるマネージ例外情報は、例外から SOAP エラーに変換される必要があります。既定のサービス例外動作を使用できます。または、例外をエラー メッセージにマッピングするかどうかとそのマッピング方法を明示的に制御できます。WCF アプリケーションでの例外と SOAP エラーの概要については、「コントラクトおよびサービスのエラーの指定と処理」を参照してください。
FaultContractAttribute を使用して、通常の操作中に受信することをクライアントが想定できるすべての SOAP エラーを正式に指定することをお勧めします。また、SOAP エラーでは、情報の開示を最小限に抑えるために、クライアントが知る必要がある情報だけを返すことをお勧めします。
注意 : |
|---|
エラー メッセージの情報でその機密性が高い場合、またはセキュリティの問題につながる可能性がある場合は、ProtectionLevel プロパティを設定することを強くお勧めします。 |
ほとんどの場合、エラー メッセージでは、ProtectionLevel を EncryptAndSign に設定すれば十分です。詳細については、「保護レベルの理解」を参照してください。
指定したエラーを FaultContractAttribute でマークした操作から返すには、操作中にマネージ例外が発生したときに、FaultException<(Of <(TDetail>)>) をスローします (型パラメータは、シリアル化可能なエラー情報です)。WCF クライアント アプリケーションは、SOAP エラーの型を、クライアントの実装でスローされたのと同じ型、つまり FaultException<(Of <(TDetail>)>) として処理します (型パラメータは、シリアル化可能なエラー情報です)。FaultContractAttribute は、双方向サービス操作と非同期操作のペアで発生する SOAP エラーを指定する場合のみ使用できます。一方向操作では SOAP エラーはサポートされないため、FaultContractAttribute もサポートされません。
たとえば、クライアントが Int32 を含む SOAP エラーの受信を想定できるように指定するには、サービス メソッドの FaultContractAttribute に型パラメータを配置します。
<OperationContractAttribute(), FaultContractAttribute(GetType(Integer))> _
Function Divide(ByVal arg1 As Integer, ByVal arg2 As Integer) As Integer
End Interface 'FCADemonstration
[OperationContractAttribute]
[FaultContractAttribute(typeof(int))]
int Divide(int arg1, int arg2);
その後、サービス メソッドの中で、型パラメータがエラー情報を格納する型 (先に説明した例の場合は Int32) である新しい FaultException<(Of <(TDetail>)>) をスローします。例 :
Throw New FaultException(Of Integer)(4)
throw new FaultException<int>(4);
上の例は非常に基本的な形であり、System..::.Int32 コードを使用してあらゆる情報を渡すことができます。したがって、この詳細型は最も有効な型ではありません。通常、WCF アプリケーションでは、クライアントのエラー情報要件に固有の詳細型を使用して SOAP エラーを指定します。より完全な例については、「使用例」のセクションを参照してください。
例外または FaultException<(Of <(TDetail>)>) がスローされるときのアプリケーションの動作を明示的に制御するには、System.ServiceModel.Description..::.IServiceBehavior、System.ServiceModel.Description..::.IContractBehavior、または System.ServiceModel.Description..::.IEndpointBehavior で System.ServiceModel.Dispatcher..::.IErrorHandler インターフェイスを実装し、これを ChannelDispatcherErrorhandlers()()() プロパティに割り当てます。IErrorHandler は、生成される SOAP エラーと、生成された SOAP エラーをクライアントに送信するかどうかを明示的に制御できるようにします。
デバッグを容易にするには、コード内で ServiceBehaviorAttribute..::.IncludeExceptionDetailInFaults を true に設定します。または、アプリケーション構成ファイルの中で ServiceDebugBehavior..::.IncludeExceptionDetailInFaults を使用できます。有効な場合は、サービスが自動的に例外情報を呼び出し元に返します。これらのエラーは、FaultException 例外としてクライアントに表示されます。