Leggere in inglese

Condividi tramite


Procedura: ispezionare e modificare i messaggi sul servizio

È possibile ispezionare o modificare i messaggi in arrivo o in uscita su un client Windows Communication Foundation (WCF) implementando un'interfaccia System.ServiceModel.Dispatcher.IDispatchMessageInspector e inserendola nel runtime del servizio. Per altre informazioni, vedere Estensione dei dispatcher. La funzionalità equivalente nel servizio è System.ServiceModel.Dispatcher.IClientMessageInspector.

Per ispezionare o modificare i messaggi

  1. Implementare l'interfaccia System.ServiceModel.Dispatcher.IDispatchMessageInspector.

  2. Implementare un'interfaccia System.ServiceModel.Description.IServiceBehavior, System.ServiceModel.Description.IEndpointBehavior o System.ServiceModel.Description.IContractBehavior, a seconda dell'ambito in cui si desidera inserire facilmente il controllo dei messaggi del servizio.

  3. Inserire il comportamento prima di chiamare il metodo ICommunicationObject.Open su System.ServiceModel.ServiceHost. Per informazioni dettagliate, vedere Configurazione ed estensione del runtime con i comportamenti.

Esempio

Negli esempi di codice seguenti vengono illustrati, nell'ordine:

  • Un'implementazione del controllo del servizio.

  • Un comportamento del servizio che inserisce il controllo.

  • Un file di configurazione che carica ed esegue il comportamento in un'applicazione del servizio.

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
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());
    }
  }
}
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>

Vedi anche