IEndpointBehavior.ApplyDispatchBehavior Método

Definición

Implementa una modificación o extensión del servicio en este punto de conexión.

public:
 void ApplyDispatchBehavior(System::ServiceModel::Description::ServiceEndpoint ^ endpoint, System::ServiceModel::Dispatcher::EndpointDispatcher ^ endpointDispatcher);
public void ApplyDispatchBehavior (System.ServiceModel.Description.ServiceEndpoint endpoint, System.ServiceModel.Dispatcher.EndpointDispatcher endpointDispatcher);
abstract member ApplyDispatchBehavior : System.ServiceModel.Description.ServiceEndpoint * System.ServiceModel.Dispatcher.EndpointDispatcher -> unit
Public Sub ApplyDispatchBehavior (endpoint As ServiceEndpoint, endpointDispatcher As EndpointDispatcher)

Parámetros

endpoint
ServiceEndpoint

punto de conexión que expone el contrato.

endpointDispatcher
EndpointDispatcher

Distribuidor del punto de conexión que se va a modificar o extender.

Ejemplos

El ejemplo de código siguiente muestra la implementación de un comportamiento del punto de conexión que agrega un objeto System.ServiceModel.Dispatcher.IDispatchMessageInspector en una aplicación de servicio. En este caso, la clase EndpointBehaviorMessageInspector implementa System.ServiceModel.Dispatcher.IDispatchMessageInspector para inspeccionar el mensaje entrante y saliente, la interfaz IEndpointBehavior para insertar la clase de inspector en el sistema de inspección de todos los extremos a los que se aplica el comportamiento, y la extensión System.ServiceModel.Configuration.BehaviorExtensionElement para habilitar el comportamiento del inspector de mensaje mediante un archivo de configuración de la aplicación.

El primer paso es implementar el inspector de mensaje.

// IDispatchMessageInspector Members

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

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

En el ejemplo de código siguiente se muestra el uso del método ApplyDispatchBehavior para agregar el inspector de mensaje a la propiedad DispatchRuntime.MessageInspectors.

// IEndpointBehavior Members
public void AddBindingParameters(ServiceEndpoint serviceEndpoint, System.ServiceModel.Channels.BindingParameterCollection bindingParameters)
{
  return;
}

public void ApplyClientBehavior(ServiceEndpoint serviceEndpoint, ClientRuntime behavior)
{
  behavior.MessageInspectors.Add(new EndpointBehaviorMessageInspector());
}

public void ApplyDispatchBehavior(ServiceEndpoint serviceEndpoint, EndpointDispatcher endpointDispatcher)
{
  endpointDispatcher.DispatchRuntime.MessageInspectors.Add(new EndpointBehaviorMessageInspector());
}

public void Validate(ServiceEndpoint serviceEndpoint)
{
  return;
}

El ejemplo de código siguiente muestra la implementación de System.ServiceModel.Configuration.BehaviorExtensionElement para habilitar el uso del comportamiento del inspector de mensaje desde un archivo de configuración.

// BehaviorExtensionElement members
public override Type BehaviorType
{
  get { return typeof(EndpointBehaviorMessageInspector); }
}

protected override object CreateBehavior()
{
  return new EndpointBehaviorMessageInspector();
}

Por último, el siguiente archivo de configuración muestra cómo utilizar el ejemplo anterior desde la configuración.

<configuration>
  <system.serviceModel>
    <services>
      <service 
        name="Microsoft.WCF.Documentation.SampleService"
        behaviorConfiguration="metadataSupport"
      >
        <host>
          <baseAddresses>
            <add baseAddress="http://localhost:8080/ServiceMetadata" />
          </baseAddresses>
        </host>
        <endpoint
          address="/SampleService"
          binding="wsHttpBinding"
          behaviorConfiguration="withMessageInspector" 
          contract="Microsoft.WCF.Documentation.ISampleService"
        />
        <endpoint
           address="mex"
           binding="mexHttpBinding"
           contract="IMetadataExchange"
        />
      </service>
    </services>
    <behaviors>
      <serviceBehaviors>
      <behavior name="metadataSupport">
        <serviceMetadata httpGetEnabled="true" httpGetUrl=""/>
      </behavior>
      </serviceBehaviors>
      <endpointBehaviors>
        <behavior name="withMessageInspector">
          <endpointMessageInspector />
        </behavior>
      </endpointBehaviors>
    </behaviors>
    <extensions>
      <behaviorExtensions>
        <add 
          name="endpointMessageInspector"
          type="Microsoft.WCF.Documentation.EndpointBehaviorMessageInspector, HostApplication, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null"
        />
      </behaviorExtensions>
    </extensions>
  </system.serviceModel>
</configuration>

Comentarios

Implemente el método ApplyDispatchBehavior para ver, modificar o extender el tiempo de ejecución del servicio en todos los mensajes, o para operaciones concretas en un punto de conexión. Para obtener información detallada sobre qué personalizaciones pueden hacerse en una aplicación de servicio, vea System.ServiceModel.Dispatcher.DispatchRuntime y System.ServiceModel.Dispatcher.DispatchOperation.

Se recomienda que el método ApplyDispatchBehavior inicie una excepción NotImplementedException sólo si pretende utilizar el comportamiento en una aplicación cliente.

Tenga en cuenta que cuando se utiliza un contrato de devolución de llamada (una operación en cada dirección) puede haber dos operaciones con el mismo nombre en la descripción. Al ejecutar una iteración en las operaciones, debe asociar la dirección del mensaje del punto de conexión System.ServiceModel.Dispatcher.DispatchRuntime y lo que devuelve la propiedad DispatchRuntime.CallbackClientRuntime.

Asimismo, dado que otros comportamientos pueden haber agregado o quitado algunas operaciones del tiempo de ejecución, no hay garantía de que exista el mismo número de operaciones en la descripción como objetos System.ServiceModel.Dispatcher.DispatchOperation en la propiedad DispatchRuntime.Operations.

Se aplica a