Angeben des Dienstlaufzeitverhaltens

Nachdem Sie einen Dienstvertrag entworfen (Designing Service Contracts) und implementiert (Implementing Service Contracts) 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 zum Konfigurieren Ihrer Dienstanwendung finden Sie unter Konfigurieren von Diensten.

Überblick

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 Verhalteneine Vielzahl von Vorgangseigenschaften konfigurieren. Verhalten sind Objekte, die die WCF-Runtime (Windows Communication Foundation) verändern, indem eine Runtime-Eigenschaft festgelegt oder ein Anpassungstyp in die Runtime eingefügt wird. Weitere Informationen zur Änderung der Runtime durch die Erstellung benutzerdefinierter 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 bereitgestellter Verhalten für die verschiedenen Bereiche, die für WCF-Entwickler*innen 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 OperationBehaviorAttribute.Impersonation -Eigenschaft festgelegt wird, dass Aufrufer dieses Vorgangs Identitätswechsel unterstützen müssen.

using System;
using System.Collections.Generic;
using System.ServiceModel;
using System.Threading;

namespace Microsoft.WCF.Documentation
{
  [ServiceContract(
    Name="SampleHello",
    Namespace="http://microsoft.wcf.documentation"
  )]
  public interface IHello
  {
    [OperationContract]
    string Hello(string greeting);
  }

  public class HelloService : IHello
  {

    public HelloService()
    {
      Console.WriteLine("Service object created: " + this.GetHashCode().ToString());
    }

    ~HelloService()
    {
      Console.WriteLine("Service object destroyed: " + this.GetHashCode().ToString());
    }

    [OperationBehavior(Impersonation=ImpersonationOption.Required)]
    public string Hello(string greeting)
    {
      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;
    }
  }
}
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 ServiceBehaviorAttribute.InstanceContextMode -Eigenschaft gesteuert, wie oft der InstanceContext freigegeben wird, und die OperationBehaviorAttribute.ReleaseInstanceMode -Eigenschaft und die 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 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 ServiceHost(Object, 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 Ihr Dienstimplementierungstyp schwierig zu erstellen ist (wenn er beispielsweise keinen parameterlosen öffentlichen Konstruktor implementiert).

Beachten Sie, dass einige Features im Zusammenhang mit dem WCF-Instanziierungsverhalten (Windows Communication Foundation) anders arbeiten, wenn ein Objekt für diesen Konstruktor bereitgestellt wird. So zeigt zum Beispiel der Aufruf von 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 OperationBehaviorAttribute.ReleaseInstanceMode -Eigenschaft für alle Vorgänge auf 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 ServiceBehaviorAttribute.ConcurrencyMode -Eigenschaft auf 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="http://localhost:8080/SampleService" />
          </baseAddresses>
        </host>
        <endpoint
          address=""
          binding="wsHttpBinding"
          contract="Microsoft.WCF.Documentation.ISampleService"
        />
        <!-- Adds a WS-MetadataExchange endpoint at -->
        <!-- "http://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 -->
        <!-- "http://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.

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 Feature-Anforderungen an, die Bindungen für die Dienst- oder Client-Implementierung liefern müssen.

Vorgangsverhalten

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

Siehe auch