Angeben des Dienstlaufzeitverhaltens

Nachdem Sie einen Dienstvertrag entworfen (Entwerfen von Dienstverträgen) und implementiert (Implementieren von Dienstverträgen) haben, können Sie das Vorgangsverhalten der Dienstlaufzeit konfigurieren. In diesem Thema werden vom System bereitgestellte Dienste und Vorhangsverhalten erörtert und beschrieben, wo Sie weitere Informationen zur Erstellung neuer Verhalten finden. Einige Verhalten werden als Attribute angewendet, aber viele Verhalten werden mithilfe einer Konfigurationsdatei oder programmgesteuert angewendet. Weitere Informationen über zur Konfiguration einer Dienstanwendung finden Sie unter Konfigurieren von Diensten.

Übersicht

Der Vertrag definiert die Eingaben, Ausgaben, Datentypen und Fähigkeiten eines Diensts dieses Typs. Durch die Implementierung eines Dienstvertrags wird eine Klasse erstellt, die den durch sie implementierten Vertrag erfüllt, wenn sie mit einer Bindung an einer Adresse konfiguriert wird. Der Vertrag kennt Vertrags-, Bindungs- und Adressinformationen. Ohne sie kann der Client den Dienst nicht nutzen.

Aber Vorgangseinzelheiten, z. B. Threadingprobleme oder Instanzenverwaltung, sind für Clients nicht transparent. Nachdem ein Dienstvertrag implementiert wurde, können Sie mithilfe von Verhalten eine Vielzahl von Vorgangseigenschaften konfigurieren. Verhalten sind die Objekte, die das Windows Communication Foundation (WCF)-Laufzeitmodul verändern, indem eine Laufzeiteigenschaft festgelegt oder ein Anpassungstyp in das Laufzeitmodul eingefügt wird. Weitere Informationen über zur Änderung des Laufzeitmoduls durch benutzerdefinierte Verhalten finden Sie unter Erweitern von ServiceHost und der Dienstmodellebene.

Das System.ServiceModel.ServiceBehaviorAttribute-Attribut und das System.ServiceModel.OperationBehaviorAttribute-Attribute sind die Verhalten, die am häufigsten verwendet werden, und sie machen die am häufigsten angeforderten Vorgangsfunktionen verfügbar. Weil es sich um Attribute handelt, wenden Sie sie auf die Dienst- oder Vorgangsimplementierung an. Andere Verhalten, wie z. B. System.ServiceModel.Description.ServiceMetadataBehavior oder System.ServiceModel.Description.ServiceDebugBehavior, werden in der Regel mithilfe einer Anwendungskonfigurationsdatei angewendet, obwohl sie auch im Code verwendet werden können.

Dieses Thema bietet einen Überblick über die Attribute ServiceBehaviorAttribute und OperationBehaviorAttribute. Es werden die verschiedenen Bereiche beschrieben, in denen Verhalten wirksam sein können, und das Thema enthält Kurzbeschreibungen vieler vom System bereitgestellten Verhalten für die verschiedenen Bereiche, die für WCF-Entwickler von Interesse sein können.

ServiceBehaviorAttribute und OperationBehaviorAttribute

Die wichtigsten Verhalten sind das ServiceBehaviorAttribute-Attribut und das OperationBehaviorAttribute-Attribut, mit denen Sie Folgendes steuern können:

  • Lebensdauer von Instanzen

  • Unterstützung für Parallelität und Synchronisierung

  • Konfigurationsverhalten

  • Transaktionsverhalten

  • Serialisierungsverhalten

  • Metadatentransformation

  • Sitzungslebensdauer

  • Adressfilterung und Headerverarbeitung

  • Identitätswechsel

  • Sie verwenden diese Attribute, indem Sie eine Dienst- oder Vorgangsimplementierung mit dem für den betreffenden Bereich geeigneten Attribut markieren und die Eigenschaften festlegen. Im folgenden Codebeispiel wird eine Vorgangsimplementierung veranschaulicht, in der mithilfe der System.ServiceModel.OperationBehaviorAttribute.Impersonation-Eigenschaft festgelegt wird, dass Aufrufer dieses Vorgangs Identitätswechsel unterstützen müssen.

Imports System.ServiceModel
Imports System.Threading

Namespace Microsoft.WCF.Documentation
  <ServiceContract(Name:="SampleHello", Namespace:="http://microsoft.wcf.documentation")> _
  Public Interface IHello
    <OperationContract> _
    Function Hello(ByVal greeting As String) As String
  End Interface

  Public Class HelloService
      Implements IHello

    Public Sub New()
      Console.WriteLine("Service object created: " & Me.GetHashCode().ToString())
    End Sub

    Protected Overrides Sub Finalize()
      Console.WriteLine("Service object destroyed: " & Me.GetHashCode().ToString())
    End Sub

    <OperationBehavior(Impersonation:=ImpersonationOption.Required)> _
    Public Function Hello(ByVal greeting As String) As String Implements IHello.Hello
      Console.WriteLine("Called by: " & Thread.CurrentPrincipal.Identity.Name)
      Console.WriteLine("IsAuthenticated: " & Thread.CurrentPrincipal.Identity.IsAuthenticated.ToString())
      Console.WriteLine("AuthenticationType: " & Thread.CurrentPrincipal.Identity.AuthenticationType.ToString())

      Console.WriteLine("Caller sent: " & greeting)
      Console.WriteLine("Sending back: Hi, " & Thread.CurrentPrincipal.Identity.Name)
      Return "Hi, " & Thread.CurrentPrincipal.Identity.Name
    End Function
  End Class
End Namespace

Viele dieser Eigenschaften erfordern zusätzliche Unterstützung von der Bindung. Beispielsweise muss ein Vorgang, der von einem Client eine Transaktion erfordert, so konfiguriert werden, dass eine Bindung verwendet wird, die übergegangene Transaktionen unterstützt.

Bekannte Singleton-Dienste

Sie können mit dem ServiceBehaviorAttribute-Attribut und dem OperationBehaviorAttribute-Attribut sowohl bei InstanceContext als auch bei den Dienstobjekten, die die Vorgänge implementieren, die Lebensdauer bestimmter Objekte steuern.

Beispielsweise wird über die System.ServiceModel.ServiceBehaviorAttribute.InstanceContextMode-Eigenschaft gesteuert, wie oft der InstanceContext freigegeben wird, und die System.ServiceModel.OperationBehaviorAttribute.ReleaseInstanceMode-Eigenschaft und die System.ServiceModel.ServiceBehaviorAttribute.ReleaseServiceInstanceOnTransactionComplete-Eigenschaft bestimmen, wann das Dienstobjekt freigegeben wird.

Sie können jedoch auch selbst ein Dienstobjekt und den Diensthost, der dieses Objekt verwendet, erstellen. Hierfür müssen Sie auch die System.ServiceModel.ServiceBehaviorAttribute.InstanceContextMode-Eigenschaft auf Single festlegen, damit keine Ausnahme ausgelöst wird, sobald der Diensthost geöffnet wird.

Verwenden Sie zum Erstellen eines solchen Diensts den System.ServiceModel.ServiceHost.#ctor(System.Object,System.Uri[])-Konstruktor. Dieser stellt eine Alternative zur Implementierung eines benutzerdefinierten System.ServiceModel.Dispatcher.IInstanceContextInitializer dar, wenn Sie eine bestimmte Objektinstanz für einen Singleton-Dienst bereitstellen möchten. Sie können diese Überladung verwenden, wenn der Dienstimplementierungstyp schwer zu erstellen ist (wenn er z. B. keinen öffentlichen parameterlosen Standardkonstruktor implementiert).

Beachten Sie, dass einige Funktionen im Zusammenhang mit dem Windows Communication Foundation (WCF)-Instanziierungsverhalten anders arbeiten, wenn ein Objekt für diesen Konstruktor bereitgestellt wird. So zeigt zum Beispiel der Aufruf von System.ServiceModel.InstanceContext.ReleaseServiceInstance keine Wirkung, wenn eine bekannte Objektinstanz bereitgestellt wird. Dementsprechend werden auch alle anderen Instanzfreigabemechanismen ignoriert. Die ServiceHost-Klasse verhält sich immer so, als ob die System.ServiceModel.OperationBehaviorAttribute.ReleaseInstanceMode-Eigenschaft für alle Vorgänge auf System.ServiceModel.ReleaseInstanceMode.None festgelegt ist.

Andere Dienst-, Endpunkt-, Vertrags- und Vorgangsverhalten

Dienstverhalten, z. B. das ServiceBehaviorAttribute-Attribut, wirken sich auf den gesamten Dienst aus. Wenn Sie beispielsweise die System.ServiceModel.ServiceBehaviorAttribute.ConcurrencyMode-Eigenschaft auf System.ServiceModel.ConcurrencyMode.Multiple-festlegen, müssen Sie Threadsynchronisierungsprobleme in jedem Vorgang innerhalb des betreffenden Diensts selbst behandeln. Endpunktverhalten operieren über einen Endpunkt. Viele der vom System bereitgestellten Endpunktverhalten beeinflussen die Clientfunktionalität. Vertragsverhalten operieren auf Vertragsebene, und Vorgangsverhalten ändern die Vorgangszustellung.

Viele dieser Verhalten werden über Attribute implementiert, und Sie verwenden sie ebenso wie das ServiceBehaviorAttribute-Attribut und das OperationBehaviorAttribute-Attribut, indem Sie sie auf die betreffende Dienstklassen- oder Vorgangsimplementierung anwenden. Andere Verhalten, wie z. B. das ServiceMetadataBehavior -Objekt oder das ServiceDebugBehavior-Objekt, werden in der Regel mithilfe einer Anwendungskonfigurationsdatei angewendet, obwohl sie auch im Code verwendet werden können.

Zum Beispiel wird die Veröffentlichung der Metadaten durch den Einsatz des ServiceMetadataBehavior-Objekts konfiguriert. Die folgende Anwendungskonfigurationsdatei veranschaulicht die gängigste Verwendungsweise.

<configuration>
  <system.serviceModel>
    <services>
      <service 
        name="Microsoft.WCF.Documentation.SampleService"
        behaviorConfiguration="metadataSupport"
      >
        <host>
          <baseAddresses>
            <add baseAddress="https://localhost:8080/SampleService" />
          </baseAddresses>
        </host>
        <endpoint
          address=""
          binding="wsHttpBinding"
          contract="Microsoft.WCF.Documentation.ISampleService"
        />
        <!-- Adds a WS-MetadataExchange endpoint at -->
        <!-- "https://localhost:8080/SampleService/mex" -->
        <endpoint
           address="mex"
           binding="mexHttpBinding"
           contract="IMetadataExchange"
        />
      </service>
    </services>
    <behaviors>
      <serviceBehaviors>
      <behavior name="metadataSupport">
        <!-- Enables the IMetadataExchange endpoint in services that -->
        <!-- use "metadataSupport" in their behaviorConfiguration attribute. -->
        <!-- In addition, the httpGetEnabled and httpGetUrl attributes publish -->
        <!-- Service metadata for retrieval by HTTP/GET at the address -->
        <!-- "https://localhost:8080/SampleService?wsdl" -->
        <serviceMetadata httpGetEnabled="true" httpGetUrl=""/>
      </behavior>
    </serviceBehaviors>
  </behaviors>
  </system.serviceModel>
</configuration>

In den folgenden Abschnitten werden viele der nützlichsten vom System bereitgestellten Verhalten beschrieben, mit denen die Bereitstellung eines Diensts oder Clients zur Laufzeit geändert werden kann. Informationen dazu, wann die einzelnen Verhalten verwendet werden, finden Sie im Referenzthema.

Dienstverhalten

Die folgenden Verhalten wirken sich auf Dienste aus.

  • AspNetCompatibilityRequirementsAttribute. Wird auf einen WCF-Dienst angewendet, um anzugeben, ob dieser Dienst im ASP.NET-Kompatibilitätsmodus ausgeführt werden kann.

  • ServiceAuthorizationBehavior. Steuert, wie der Dienst Clientansprüche autorisiert.

  • ServiceCredentials. Konfiguriert Dienstanmeldeinformationen. Verwenden Sie diese Klasse, um die Anmeldeinformationen für den Dienst anzugeben, beispielsweise ein X.509-Zertifikat.

  • ServiceDebugBehavior. Aktiviert Debugging- und Hilfeinformationsfunktionen für einen WCF-Dienst.

  • ServiceMetadataBehavior. Steuert die Veröffentlichung von Dienstmetadaten und zugehörigen Informationen.

  • ServiceSecurityAuditBehavior. Legt das Überwachungsverhalten für Sicherheitsereignisse fest.

  • ServiceThrottlingBehavior. Konfiguriert Laufzeitdurchsatzeinstellungen, die es Ihnen ermöglichen, die Dienstleistung zu optimieren.

Endpunktverhalten

Die folgenden Verhalten wirken sich auf Endpunkte aus. Viele dieser Verhalten werden in Clientanwendungen verwendet.

  • CallbackBehaviorAttribute. Konfiguriert eine Rückrufdienstimplementierung in einer Duplexclientanwendung.

  • CallbackDebugBehavior. Aktiviert das Dienstdebugging für ein WCF-Rückrufobjekt.

  • ClientCredentials. Ermöglicht es dem Benutzer, die Client- und Dienstanmeldeinformationen sowie die auf dem Client zu verwendenden Authentifizierungseinstellungen für die Dienstanmeldeinformationen zu konfigurieren.

  • ClientViaBehavior. Wird von Clients verwendet, um den URI (Uniform Resource Identifier) anzugeben, für den der Transportkanal erstellt werden soll.

  • MustUnderstandBehavior. Weist WCF an, die Verarbeitung von MustUnderstand zu deaktivieren.

  • SynchronousReceiveBehavior. Weist das Laufzeitmodul an, für Kanäle einen synchronen Empfangsprozess zu verwenden.

  • TransactedBatchingBehavior. Optimiert die Empfangsvorgänge für Transporte, die transaktionale Empfangsprozesse unterstützen.

Vertragsverhalten

DeliveryRequirementsAttribute. Gibt die Funktionsanforderungen an, die Bindungen für die Dienst- oder Clientimplementierung erfüllen müssen.

Vorgangsverhalten

Die folgenden Vorgangsverhalten geben die Serialisierungs- und Transaktionssteuermechanismen für Vorgänge an.

Siehe auch

Aufgaben

Vorgehensweise: Steuern der Dienstinstanzierung

Weitere Ressourcen

Konfigurieren von Diensten