Freigeben über


Konfigurieren und Erweitern der Laufzeit mit Verhalten

Mit Verhalten können Sie das Standardverhalten ändern und benutzerdefinierte Erweiterungen hinzufügen, die die Dienstkonfiguration prüfen und validieren oder das Laufzeitverhalten in Windows Communication Foundation (WCF)-Client- und Dienstanwendungen ändern. In diesem Thema werden die Verhaltensschnittstellen, deren Implementierung sowie die Möglichkeit beschrieben, sie entweder programmgesteuert oder über eine Konfigurationsdatei zur Dienstbeschreibung (in einer Dienstanwendung) oder zum Endpunkt (in einer Clientanwendung) hinzuzufügen. Weitere Informationen zur Verwendung von vom System bereitgestellten Verhaltensweisen finden Sie unter Angeben von Dienst-Run-Time-Verhalten und Angeben von Client-Run-Time-Verhalten.

Verhaltensweisen

Verhaltenstypen werden den Beschreibungsobjekten des Diensts oder des Dienstendpunkts (auf dem Dienst oder Client) hinzugefügt, bevor diese Objekte von Windows Communication Foundation (WCF) verwendet werden, um eine Laufzeit zu erstellen, die einen WCF-Dienst oder einen WCF-Client ausführt. Wenn diese Verhaltensweisen während des Laufzeitkonstruktionsprozesses aufgerufen werden, können sie dann auf Laufzeiteigenschaften und -methoden zugreifen, die die vom Vertrag, Bindungen und Adressen erstellte Laufzeit ändern.

Verhaltensmethoden

Alle Verhaltensweisen weisen eine AddBindingParameters Methode, eine ApplyDispatchBehavior Methode, eine Validate Methode und eine ApplyClientBehavior Methode mit einer Ausnahme auf: Weil IServiceBehavior nicht in einem Client ausgeführt werden kann, implementiert sie ApplyClientBehavior nicht.

  • Verwenden Sie die AddBindingParameters-Methode, um benutzerdefinierte Objekte zu ändern oder einer Sammlung hinzuzufügen, auf die benutzerdefinierte Bindungen beim Erstellen der Laufzeit für ihre Verwendung zugreifen können. So werden beispielsweise die Schutzanforderungen angegeben, die sich auf die Art und Weise auswirken, wie der Kanal erstellt wird, aber vom Kanalentwickler nicht bekannt sind.

  • Verwenden Sie die Validate Methode, um die Beschreibungsstruktur und das entsprechende Laufzeitobjekt zu untersuchen, um sicherzustellen, dass sie einigen Kriteriengruppen entspricht.

  • Verwenden Sie die ApplyDispatchBehavior- und ApplyClientBehavior-Methoden, um die Beschreibungsstruktur zu untersuchen und die Laufzeit für einen bestimmten Umfang entweder auf dem Dienst oder dem Client zu ändern. Sie können auch Erweiterungsobjekte einfügen.

    Hinweis

    Obwohl eine Beschreibungsstruktur in diesen Methoden bereitgestellt wird, dient sie nur zur Überprüfung. Wenn eine Beschreibungsstruktur geändert wird, ist das Verhalten nicht definiert.

Auf die Eigenschaften, die Sie ändern können, und auf die Anpassungsschnittstellen, die Sie implementieren können, wird über die Dienst- und Clientlaufzeitklassen zugegriffen. Die Diensttypen sind die DispatchRuntime und DispatchOperation Klassen. Die Clienttypen sind die ClientRuntime und ClientOperation Klassen. Die ClientRuntime-Klasse und die DispatchRuntime-Klasse sind Erweiterungseinstiegspunkte, um clientweit und dienstweit auf Laufzeiteigenschaften bzw. Erweiterungssammlungen zuzugreifen. Entsprechend machen die Klassen ClientOperation und DispatchOperation Clientvorgangs- und Dienstbetriebs-Laufzeiteigenschaften sowie Erweiterungssammlungen verfügbar. Sie können jedoch auf das breiter angelegte Laufzeitobjekt vom Vorgangslaufzeitobjekt aus und umgekehrt zugreifen, sofern erforderlich.

Hinweis

Eine Erläuterung der Laufzeiteigenschaften und Erweiterungstypen, die Sie zum Ändern des Ausführungsverhaltens eines Clients verwenden können, finden Sie unter Erweitern von Clients. Eine Erläuterung der Laufzeiteigenschaften und Erweiterungstypen, die Sie zum Ändern des Ausführungsverhaltens eines Dienstverteilers verwenden können, finden Sie unter Erweitern von Dispatchern.

Die meisten WCF-Benutzer interagieren nicht direkt mit der Laufzeit. Stattdessen verwenden sie Kernprogrammierungsmodellkonstrukte wie Endpunkte, Verträge, Bindungen, Adressen und Verhaltensattribute für Klassen oder Verhaltensweisen in Konfigurationsdateien. Diese Konstrukte bilden die Beschreibungsstruktur, bei der es sich um die vollständige Spezifikation zum Erstellen einer Laufzeit zur Unterstützung eines Diensts oder Clients handelt, der durch die Beschreibungsstruktur beschrieben wird.

Es gibt vier Arten von Verhaltensweisen in WCF:

Sie können diese Verhaltensweisen den verschiedenen Beschreibungsobjekten hinzufügen, indem Sie benutzerdefinierte Attribute implementieren, Anwendungskonfigurationsdateien verwenden oder sie direkt der Verhaltensauflistung für das entsprechende Beschreibungsobjekt hinzufügen. Sie müssen jedoch zu einer Dienstbeschreibung oder einem Dienstendpunkt-Beschreibungsobjekt hinzugefügt werden, bevor ICommunicationObject.Open auf dem ServiceHost oder einer ChannelFactory<TChannel> aufgerufen wird.

Verhaltensbereiche

Es gibt vier Verhaltenstypen, die jeweils einem bestimmten Laufzeitzugriff entsprechen.

Dienstverhalten

Dienstverhalten, die IServiceBehavior implementieren, sind der primäre Mechanismus, mit dem Sie die gesamte Ausführungszeit des Dienstes ändern. Es gibt drei Mechanismen zum Hinzufügen von Dienstverhalten zu einem Dienst.

  1. Verwenden eines Attributs für die Dienstklasse. Wenn ein ServiceHost konstruiert wird, verwendet die ServiceHost Implementierung Reflexion, um den Satz von Attributen am Service-Typ zu ermitteln. Wenn eines dieser Attribute Implementierungen von IServiceBehavior sind, werden sie der Sammlung von Verhaltensweisen auf ServiceDescription hinzugefügt. Auf diese Weise können diese Verhaltensweisen an der Erstellung der Dienstlaufzeit teilnehmen.

  2. Programmgesteuertes Hinzufügen des Verhaltens zur Verhaltensauflistung auf ServiceDescription. Dies kann mit den folgenden Codezeilen erreicht werden:

    ServiceHost host = new ServiceHost(/* Parameters */);
    host.Description.Behaviors.Add(/* Service Behavior */);
    
  3. Implementieren eines benutzerdefinierten BehaviorExtensionElement, das die Konfiguration erweitert. Dies ermöglicht die Verwendung des Dienstverhaltens aus Anwendungskonfigurationsdateien.

Beispiele für Dienstverhalten in WCF sind das ServiceBehaviorAttribute Attribut, das ServiceThrottlingBehavior Attribut und das ServiceMetadataBehavior Verhalten.

Vertragsverhalten

Vertragsverhalten, das die IContractBehavior Schnittstelle implementiert, werden verwendet, um sowohl die Client- als auch die Dienstlaufzeit über einen Vertrag hinweg zu erweitern.

Es gibt zwei Mechanismen zum Hinzufügen von Vertragsverhalten zu einem Vertrag. Der erste Mechanismus besteht darin, ein benutzerdefiniertes Attribut zu erstellen, das auf der Vertragsschnittstelle verwendet werden soll. Wenn eine Vertragsschnittstelle entweder an ServiceHost oder ChannelFactory<TChannel> übergeben wird, untersucht WCF die Attribute dieser Schnittstelle. Wenn Attribute Implementierungen von IContractBehavior sind, werden diese der Verhaltenssammlung der für diese Schnittstelle erstellten System.ServiceModel.Description.ContractDescription hinzugefügt.

Sie können das System.ServiceModel.Description.IContractBehaviorAttribute auch im benutzerdefinierten Vertragsverhaltensattribut implementieren. In diesem Fall sieht das Verhalten wie folgt aus bei der Anwendung auf:

•Eine Vertragsschnittstelle. In diesem Fall wird das Verhalten auf alle Verträge dieses Typs in jedem Endpunkt angewendet, und WCF ignoriert den Wert der IContractBehaviorAttribute.TargetContract Eigenschaft.

•Eine Dienstklasse. In diesem Fall wird das Verhalten nur auf Endpunkte angewendet, deren Vertrag der Wert der TargetContract-Eigenschaft ist.

• Eine Rückrufklasse. In diesem Fall wird das Verhalten auf den Endpunkt des Duplexclients angewendet, und WCF ignoriert den Wert der TargetContract Eigenschaft.

Der zweite Mechanismus besteht darin, das Verhalten zur Verhaltenssammlung eines ContractDescription hinzuzufügen.

Beispiele für Vertragsverhalten in WCF sind das System.ServiceModel.DeliveryRequirementsAttribute Attribut. Weitere Informationen und ein Beispiel finden Sie im Referenzthema.

Endpunktverhalten

Endpunktverhalten, die IEndpointBehavior implementieren, sind der primäre Mechanismus, mit dem Sie die gesamte Laufzeit eines Dienstes oder Clients für einen bestimmten Endpunkt ändern.

Es gibt zwei Mechanismen zum Hinzufügen von Endpunktverhalten zu einem Dienst.

  1. Hinzufügen des Verhaltens zur Behaviors-Eigenschaft.

  2. Implementieren Sie eine benutzerdefinierte BehaviorExtensionElement, die die Konfiguration erweitert.

Weitere Informationen und ein Beispiel finden Sie im Referenzthema.

Betriebsverhalten

Vorgangsverhalten, das die IOperationBehavior Schnittstelle implementiert, werden verwendet, um sowohl die Client- als auch die Dienstlaufzeit für jeden Vorgang zu erweitern.

Es gibt zwei Mechanismen zum Hinzufügen von Vorgangsverhalten zu einem Vorgang. Der erste Mechanismus besteht darin, ein benutzerdefiniertes Attribut zu erstellen, das für die Methode verwendet werden soll, die den Vorgang modelliert. Wird ein Vorgang entweder ServiceHost oder ChannelFactory hinzugefügt, fügt WCF jedes IOperationBehavior-Attribut zur Verhaltenssammlung in der für diesen Vorgang erstellten OperationDescription hinzu.

Der zweite Mechanismus besteht darin, das Verhalten direkt der Verhaltensauflistung für ein konstruiertes OperationDescriptionElement hinzuzufügen.

Beispiele für Vorgangsverhalten in WCF sind die OperationBehaviorAttribute und die TransactionFlowAttribute.

Weitere Informationen und ein Beispiel finden Sie im Referenzthema.

Verwenden der Konfiguration zum Erstellen von Verhaltensweisen

Dienst- und Endpunkt- und Vertragsverhalten können so konzipiert werden, dass sie im Code angegeben oder Attribute verwendet werden; Nur Dienst- und Endpunktverhalten können mithilfe von Anwendungs- oder Webkonfigurationsdateien konfiguriert werden. Durch das Verfügbarmachen von Verhaltensweisen mithilfe von Attributen können Entwickler ein Verhalten zur Kompilierungszeit angeben, das zur Laufzeit nicht hinzugefügt, entfernt oder geändert werden kann. Dies eignet sich häufig für Verhaltensweisen, die für den richtigen Vorgang eines Diensts immer erforderlich sind (z. B. die transaktionsbezogenen Parameter für das System.ServiceModel.ServiceBehaviorAttribute Attribut). Wenn Sie Verhalten über die Konfiguration verfügbar machen, können Entwickler die Spezifikation und Konfiguration dieser Verhalten denjenigen überlassen, die den Dienst bereitstellen. Dies eignet sich für Verhaltensweisen, die optionale Komponenten oder eine andere bereitstellungsspezifische Konfiguration sind, z. B. ob Metadaten für den Dienst oder die bestimmte Autorisierungskonfiguration für einen Dienst verfügbar gemacht werden.

Hinweis

Sie können auch Verhaltensweisen verwenden, die die Konfiguration unterstützen, um Unternehmensanwendungsrichtlinien zu erzwingen, indem Sie sie in die machine.config Konfigurationsdatei einfügen und diese Elemente sperren. Eine Beschreibung und ein Beispiel finden Sie unter Vorgehensweise: Sperren von Endpunkten im Unternehmen.

Um ein Verhalten mithilfe der Konfiguration verfügbar zu machen, muss ein Entwickler eine abgeleitete Klasse erstellen BehaviorExtensionElement und diese Erweiterung dann bei der Konfiguration registrieren.

Das folgende Codebeispiel zeigt, wie ein IEndpointBehaviorBehaviorExtensionElement implementiert.

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

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

Damit das Konfigurationssystem ein benutzerdefiniertes BehaviorExtensionElement lädt, muss dieses als Erweiterung registriert werden. Das folgende Codebeispiel zeigt die Konfigurationsdatei für das vorherige Endpunktverhalten:

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

Dabei Microsoft.WCF.Documentation.EndpointBehaviorMessageInspector handelt es sich um den Typ der Verhaltenserweiterung und HostApplication den Namen der Assembly, in die diese Klasse kompiliert wurde.

Auswertungsreihenfolge

Die System.ServiceModel.ChannelFactory<TChannel> und der System.ServiceModel.ServiceHost sind für das Erstellen der Laufzeit aus dem Programmierungsmodell und der Beschreibung verantwortlich. Verhaltenstypen, wie zuvor beschrieben, tragen zu diesem Erstellungsprozess auf der Dienst-, Endpunkt-, Vertrags- und Vorgangsebene bei.

Die ServiceHost wendet Verhaltensweisen in der folgenden Reihenfolge an:

  1. Dienstleistung

  2. Vertrag

  3. Endpunkt

  4. Vorgang

Innerhalb einer Sammlung von Verhaltensweisen wird keine Reihenfolge garantiert.

Die ChannelFactory<TChannel> wendet Verhaltensweisen in der folgenden Reihenfolge an:

  1. Vertrag

  2. Endpunkt

  3. Vorgang

Innerhalb einer Sammlung von Verhaltensweisen wird wieder keine Reihenfolge garantiert.

Programmgesteuertes Hinzufügen von Verhaltensweisen

Eigenschaften des System.ServiceModel.Description.ServiceDescription in der Dienstanwendung dürfen nach der Verwendung der CommunicationObject.OnOpening-Methode auf System.ServiceModel.ServiceHostBase nicht geändert werden. Einige Member, wie die ServiceHostBase.Credentials-Eigenschaft und die AddServiceEndpoint-Methoden auf ServiceHostBase und System.ServiceModel.ServiceHost, lösen eine Ausnahme aus, wenn eine Änderung über diesen Punkt hinaus stattfindet. Andere erlauben Es Ihnen, sie zu ändern, aber das Ergebnis ist nicht definiert.

Ähnlich verhält es sich mit den System.ServiceModel.Description.ServiceEndpoint-Werten, die auf dem Client nach dem Aufruf von OnOpening auf System.ServiceModel.ChannelFactory nicht geändert werden dürfen. Die ChannelFactory.Credentials Eigenschaft löst eine Ausnahme aus, wenn sie über diesen Punkt geändert wurde, aber die anderen Clientbeschreibungswerte können ohne Fehler geändert werden. Das Ergebnis ist jedoch nicht definiert.

Ob es um den Dienst oder den Klienten geht, es wird empfohlen, die Beschreibung zu ändern, bevor CommunicationObject.Open aufgerufen wird.

Vererbungsregeln für Verhaltensattribute

Alle vier Arten von Verhaltensweisen können mithilfe von Attributen aufgefüllt werden – Dienstverhalten und Vertragsverhalten. Da Attribute für verwaltete Objekte und Member definiert sind und verwaltete Objekte und Member die Vererbung unterstützen, müssen Sie definieren, wie Verhaltensattribute im Kontext der Vererbung funktionieren.

Auf hoher Ebene ist die Regel, dass für einen bestimmten Bereich (z. B. Dienst, Vertrag oder Vorgang) alle Verhaltensattribute in der Vererbungshierarchie für diesen Bereich angewendet werden. Wenn zwei Verhaltensattribute desselben Typs vorhanden sind, wird nur der am häufigsten abgeleitete Typ verwendet.

Dienstverhalten

Für eine bestimmte Dienstklasse werden alle Dienstverhaltensattribute für diese Klasse und für übergeordnete Elemente dieser Klasse angewendet. Wenn derselbe Attributtyp an mehreren Stellen in der Vererbungshierarchie angewendet wird, wird der am häufigsten abgeleitete Typ verwendet.

[ServiceBehavior(ConcurrencyMode = ConcurrencyMode.Multiple)]
[AspNetCompatibilityRequirementsAttribute(
    AspNetCompatibilityRequirementsMode = AspNetCompatibilityRequirementsMode.Allowed)]
public class A { /* … */ }

[ServiceBehavior(InstanceContextMode = InstanceContextMode.Single)]
public class B : A { /* … */}

Im vorhergehenden Fall weist der Dienst B am Ende den InstanceContextMode-Modus Single, den AspNetCompatibilityRequirementsMode-Modus Allowed und den ConcurrencyMode-Modus Single auf. Der ConcurrencyMode-Modus lautet Single, da das ServiceBehaviorAttribute-Attribut für den Dienst B "mehr Ableitungen" aufweist als Dienst A.

Vertragsverhalten

Für einen bestimmten Vertrag werden alle Vertragsverhaltensattribute für diese Schnittstelle und für übergeordnete Elemente dieser Schnittstelle angewendet. Wenn derselbe Attributtyp an mehreren Stellen in der Vererbungshierarchie angewendet wird, wird der am häufigsten abgeleitete Typ verwendet.

Betriebsverhalten

Wenn ein bestimmter Vorgang einen vorhandenen abstrakten oder virtuellen Vorgang nicht außer Kraft setzt, gelten keine Vererbungsregeln.

Wenn ein Vorgang einen vorhandenen Vorgang überschreibt, werden alle Vorgangsverhaltensattribute für diesen Vorgang und für die übergeordneten Elemente dieses Vorgangs angewendet. Wenn derselbe Attributtyp an mehreren Stellen in der Vererbungshierarchie angewendet wird, wird der am häufigsten abgeleitete Typ verwendet.