IEndpointBehavior.ApplyDispatchBehavior Metodo

Definizione

Implementa una modifica o un'estensione del servizio all'interno di un endpoint.

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)

Parametri

endpoint
ServiceEndpoint

Endpoint che espone il contratto.

endpointDispatcher
EndpointDispatcher

Dispatcher dell'endpoint da modificare o estendere.

Esempio

Nell'esempio di codice seguente viene illustrata l'implementazione di un comportamento dell'endpoint che aggiunge un oggetto System.ServiceModel.Dispatcher.IDispatchMessageInspector a un'applicazione del servizio. In questo caso, la classe EndpointBehaviorMessageInspector implementa System.ServiceModel.Dispatcher.IDispatchMessageInspector per controllare il messaggio in entrata e in uscita, l'interfaccia IEndpointBehavior per inserire la classe di controllo nel sistema di ispezione per tutti gli endpoint per i quali è valido il comportamento e System.ServiceModel.Configuration.BehaviorExtensionElement per abilitare il comportamento del controllo messaggi utilizzando un file di configurazione dell'applicazione.

Il primo passaggio consiste nell'implementare il controllo messaggi.

// 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.");
}

Nell'esempio di codice seguente viene illustrato come utilizzare il metodo ApplyDispatchBehavior per aggiungere il controllo messaggi alla proprietà 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;
}

Nell'esempio di codice seguente viene illustrata l'implementazione di System.ServiceModel.Configuration.BehaviorExtensionElement per abilitare l'utilizzo del comportamento del controllo messaggi da un file di configurazione.

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

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

Nel file di configurazione seguente viene illustrato come utilizzare l'esempio precedente dalla configurazione.

<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>

Commenti

Implementare il metodo ApplyDispatchBehavior per visualizzare, modificare o estendere la fase di esecuzione del client all'interno di tutti i messaggi o per un operazioni specifiche in un endpoint. Per informazioni dettagliate su quali personalizzazioni è possibile eseguire in un'applicazione del servizio, vedere System.ServiceModel.Dispatcher.DispatchRuntime e System.ServiceModel.Dispatcher.DispatchOperation.

Si consiglia di far sì che il metodo ApplyDispatchBehavior generi un'eccezione NotImplementedException se il comportamento è destinato solo a essere utilizzato in un'applicazione client.

Si noti che possono esistere due operazioni con lo stesso nome nella descrizione se si utilizza un contratto di callback (un'operazione per ogni direzione). Se si scorrono le operazioni, è necessario correlare la direzione del messaggio dell'endpoint System.ServiceModel.Dispatcher.DispatchRuntime e di quello restituito dalla proprietà DispatchRuntime.CallbackClientRuntime.

Poiché altri comportamenti potrebbero aver già aggiunto o rimosso alcune operazioni dalla fase di esecuzione, non vi è alcuna garanzia che il numero di operazioni nella descrizione corrisponda al numero di oggetti System.ServiceModel.Dispatcher.DispatchOperation nella proprietà DispatchRuntime.Operations.

Si applica a