IErrorHandler インターフェイス
System.ServiceModel.Dispatc ...


IErrorHandler インターフェイス
呼び出し側から返されたエラー メッセージを実装者が制御し、ログ記録などのカスタム エラー処理をオプションで実行できるようにします。

名前空間: System.ServiceModel.Dispatcher
アセンブリ: System.ServiceModel (system.servicemodel.dll 内)

構文

Visual Basic (宣言)
Public Interface IErrorHandler
Visual Basic (使用法)
Dim instance As IErrorHandler
C#
public interface IErrorHandler
C++
public interface class IErrorHandler
J#
public interface IErrorHandler
JScript
public interface IErrorHandler
XAML
適用できません。
解説

例外がスローされたときのアプリケーションの動作を明示的に制御するには、IErrorHandler インターフェイスを実装し、それを ErrorHandlers プロパティに追加します。IErrorHandler は、生成される SOAP エラーを明示的に制御し、生成された SOAP エラーをクライアントに返すかどうかを決定し、関連付けられたタスク (ログ記録など) を実行できるようにします。

ProvideFault メソッドを実装して、クライアントに返されるエラー メッセージを制御します。

通常、IErrorHandler の実装は、サービスとクライアントで ErrorHandlers プロパティに追加されます。クライアントは双方向通信の場合です。

すべての ProvideFault 実装が呼び出されて返ったときに、fault が null 参照 (Visual Basic では Nothing) 以外の場合は、操作コントラクトに従ってクライアントに返されます。

エラー ログの記録、フェイル ファーストの保証、アプリケーションのシャットダウンなどのエラー関連の動作を行うには、HandleError メソッドを実装します。HandleError の実装が true を返す場合、後続の実装は呼び出されません。実装が存在しないか、どの実装も true を返さない場合は、ServiceBehaviorAttribute.IncludeExceptionDetailInFaults プロパティ値に応じて処理されます。

次のいずれかのメソッドを使用して、IErrorHandler をランタイムに追加できます。

動作を使用してランタイムを変更する方法の詳細については、「動作を使用した拡張機能の関連付け」を参照してください。

使用例

次のコード例では、サービス メソッドがマネージ例外をスローしたとき、GreetingFault 型の FaultException だけを返す IErrorHandler を実装するサービスを示します。

C#
#region IErrorHandler Members
public bool HandleError(Exception error)
{
  Console.WriteLine("HandleError called.");
  // Returning true indicates you performed your behavior.
  return true;
}

// This is a trivial implementation that converts Exception to FaultException<GreetingFault>.
public void ProvideFault(
  Exception error,
  MessageVersion ver,
  ref Message msg
)
{
  Console.WriteLine("ProvideFault called. Converting Exception to GreetingFault....");
  FaultException<GreetingFault> fe 
    = new FaultException<GreetingFault>(new GreetingFault(error.Message));
  MessageFault fault = fe.CreateMessageFault();
  msg = Message.CreateMessage(
    ver, 
    fault, 
    "http://microsoft.wcf.documentation/ISampleService/SampleMethodGreetingFaultFault"
  );
}
#endregion

次のコード例では、サービス動作を使用して、IErrorHandler の実装を ErrorHandlers プロパティに追加する方法を示します。

C#
// This behavior modifies no binding parameters.
#region IServiceBehavior Members
public void AddBindingParameters(
  ServiceDescription description, 
  ServiceHostBase serviceHostBase, 
  System.Collections.ObjectModel.Collection<ServiceEndpoint> endpoints, 
  System.ServiceModel.Channels.BindingParameterCollection parameters
)
{
  return;
}

// This behavior is an IErrorHandler implementation and 
// must be applied to each ChannelDispatcher.
public void ApplyDispatchBehavior(ServiceDescription description, ServiceHostBase serviceHostBase)
{
  Console.WriteLine("The EnforceGreetingFaultBehavior has been applied.");
  foreach(ChannelDispatcher chanDisp in serviceHostBase.ChannelDispatchers)
  {
    chanDisp.ErrorHandlers.Add(this);      
  }
}

// This behavior requires that the contract have a SOAP fault with a detail type of GreetingFault.
public void Validate(ServiceDescription description, ServiceHostBase serviceHostBase)
{
  Console.WriteLine("Validate is called.");
  foreach (ServiceEndpoint se in description.Endpoints)
  {
    // Must not examine any metadata endpoint.
    if (se.Contract.Name.Equals("IMetadataExchange")
      && se.Contract.Namespace.Equals("http://schemas.microsoft.com/2006/04/mex"))
      continue;
    foreach (OperationDescription opDesc in se.Contract.Operations)
    {
      if (opDesc.Faults.Count == 0)
        throw new InvalidOperationException(String.Format(
          "EnforceGreetingFaultBehavior requires a "  
          + "FaultContractAttribute(typeof(GreetingFault)) in each operation contract.  "
          + "The \"{0}\" operation contains no FaultContractAttribute.",
          opDesc.Name)
        );
      bool gfExists = false;
      foreach (FaultDescription fault in opDesc.Faults)
      {
        if (fault.DetailType.Equals(typeof(GreetingFault)))
        {
          gfExists = true;
          continue;
        }
      }
      if (gfExists == false)
      {
        throw new InvalidOperationException(
"EnforceGreetingFaultBehavior requires a FaultContractAttribute(typeof(GreetingFault)) in an operation contract."
        );
      }
    }
  }
}
#endregion

次のコード例では、アプリケーション構成ファイルを使用してサービス動作を読み込むようにサービスを構成する方法を示します。構成ファイル内のサービス動作を公開する方法の詳細については、「IServiceBehavior」を参照してください。

Xml
<configuration>
  <system.serviceModel>
    <services>
      <service 
        name="Microsoft.WCF.Documentation.SampleService"
        behaviorConfiguration="metaAndErrors">
        <host>
          <baseAddresses>
            <add baseAddress="http://localhost:8080/SampleService"/>
          </baseAddresses>
        </host>
        <endpoint
          address=""
          binding="wsHttpBinding"
          contract="Microsoft.WCF.Documentation.ISampleService"
         />
        <endpoint
          address="mex"
          binding="mexHttpBinding"
          contract="IMetadataExchange"
         />
      </service>
    </services>
    <behaviors>
      <serviceBehaviors>
        <behavior name="metaAndErrors">
          <serviceDebug includeExceptionDetailInFaults="true"/>
          <serviceMetadata httpGetEnabled="true"/>
          <enforceGreetingFaults />
        </behavior>
      </serviceBehaviors>
    </behaviors>
    <extensions>
      <behaviorExtensions>
        <add 
          name="enforceGreetingFaults" 
          type="Microsoft.WCF.Documentation.EnforceGreetingFaultBehavior,HostApplication"
        />
      </behaviorExtensions>
    </extensions>
  </system.serviceModel>
</configuration>
プラットフォーム

Microsoft .NET Framework 3.0 は Windows Vista,Microsoft Windows XP SP2,および Windows Server 2003 SP1 でサポートされています。

バージョン情報

.NET Framework

サポート対象 : 3.0
参照

タグ :


Page view tracker