英語で読む

次の方法で共有


IDispatchMessageInspector インターフェイス

定義

サービス アプリケーションの受信および送信アプリケーション メッセージのカスタム検査または変更を有効にするメソッドを定義します。

C#
public interface IDispatchMessageInspector

次のコード例は、呼び出されたときにコンソールに文字列を書き込む基本的な IDispatchMessageInspector を示しています。

C#
#region IDispatchMessageInspector Members
public object AfterReceiveRequest(ref System.ServiceModel.Channels.Message request, IClientChannel channel, InstanceContext instanceContext)
{
  Console.WriteLine("IDispatchMessageInspector.AfterReceiveRequest called.");
  return null;
}

public void BeforeSendReply(ref System.ServiceModel.Channels.Message reply, object correlationState)
{
  Console.WriteLine("IDispatchMessageInspector.BeforeSendReply called.");
}
#endregion

次のコード例は、DispatchRuntime.MessageInspectors コレクションに InspectorIDispatchMessageInspector を追加する IServiceBehavior の実装を示しています。

C#
#region IServiceBehavior Members
public void AddBindingParameters(
  ServiceDescription serviceDescription,
  ServiceHostBase serviceHostBase,
  System.Collections.ObjectModel.Collection<ServiceEndpoint> endpoints,
  BindingParameterCollection bindingParameters
)
{ return; }

public void ApplyDispatchBehavior(ServiceDescription serviceDescription, ServiceHostBase serviceHostBase)
{
  foreach (ChannelDispatcher chDisp in serviceHostBase.ChannelDispatchers)
  {
    foreach (EndpointDispatcher epDisp in chDisp.Endpoints)
    {
      epDisp.DispatchRuntime.MessageInspectors.Add(new Inspector());
      foreach (DispatchOperation op in epDisp.DispatchRuntime.Operations)
        op.ParameterInspectors.Add(new Inspector());
    }
  }
}

次のコード例は、アプリケーション構成ファイルを使用して、InspectorIDispatchMessageInspectorを挿入するサービス動作を読み込む方法を示しています。

XML
<configuration>
  <system.serviceModel>
    <services>
      <service 
        name="Microsoft.WCF.Documentation.SampleService"
        behaviorConfiguration="metadataSupport">
        <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="metadataSupport">
          <serviceMetadata httpGetEnabled="true" httpGetUrl=""/>
          <serviceInterceptors />
        </behavior>
      </serviceBehaviors>
    </behaviors>
    <extensions>
      <behaviorExtensions>
        <add 
          name="serviceInterceptors" 
          type="Microsoft.WCF.Documentation.InspectorInserter, HostApplication, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null"
        />
      </behaviorExtensions>
    </extensions>
  </system.serviceModel>
</configuration>

注釈

要求メッセージを操作にディスパッチする前、または呼び出し元に応答メッセージを返す前に、受信または送信のアプリケーション メッセージを検査または変更する IDispatchMessageInspector を実装します。 送信先の操作を呼び出す前にメッセージをインターセプトする必要があるシナリオは多数あります。 たとえば、受信アプリケーション メッセージをログに記録したり、メッセージ ヘッダーに基づいて何らかの機能を実行したりできます。

通常、メッセージ インスペクターは、サービス動作 (System.ServiceModel.Description.IServiceBehavior)、エンドポイント動作 (System.ServiceModel.Description.IEndpointBehavior)、またはコントラクト動作 (System.ServiceModel.Description.IContractBehavior) によって挿入されます。 その後、この動作により、メッセージ インスペクターが DispatchRuntime.MessageInspectors コレクションに追加されます。 動作を使用してランタイムを拡張する方法の詳細については、「 ServiceHost の拡張とサービス モデル レイヤーのを参照してください。

  • AfterReceiveRequest メソッドは、メッセージを受信した後、目的の操作にディスパッチする前にカスタム動作を有効にします。

  • BeforeSendReply メソッドは、操作が戻った後、応答が送信される前にカスタム動作を有効にします。

注意

IDispatchMessageInspector オブジェクトは、操作が一方向か要求応答かに関係なく、メッセージのディスパッチ中に常に同じ時点で呼び出されます。

メソッド

AfterReceiveRequest(Message, IClientChannel, InstanceContext)

受信メッセージを受信した後、メッセージが目的の操作にディスパッチされる前に呼び出されます。

BeforeSendReply(Message, Object)

操作が返された後、応答メッセージが送信される前に呼び出されます。

適用対象

製品 バージョン
.NET 8 (package-provided), 9 (package-provided), 10 (package-provided)
.NET Framework 3.0, 3.5, 4.0, 4.5, 4.5.1, 4.5.2, 4.6, 4.6.1, 4.6.2, 4.7, 4.7.1, 4.7.2, 4.8, 4.8.1
.NET Standard 2.0 (package-provided)