クリックして評価とフィードバックをお寄せください
MSDN
MSDN ライブラリ
.NET 開発
以前のバージョン
.NET Framework SDK 2.0
System.ServiceModel.Dispatcher

  低帯域幅での表示をオンにする
このページは次のバージョンについて記述しています。
Microsoft Visual Studio 2005/.NET Framework 2.0

その他のバージョンについては、以下の情報を参照してください。
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
コミュニティ コンテンツ   コミュニティ コンテンツとは
新しいコンテンツの追加 RSS  注釈
Processing
© 2009 Microsoft Corporation. All rights reserved. 使用条件  |  商標  |  プライバシー
Page view tracker