Teilen über


Festlegen des Verhaltens von Dienst Run-Time

Nachdem Sie einen Servicevertrag (Entwerfen von Serviceverträgen) entworfen und Ihren Servicevertrag (Implementieren von Serviceverträgen) implementiert haben, können Sie das Betriebsverhalten der Dienstlaufzeit konfigurieren. In diesem Thema werden vom System bereitgestellte Dienst- und Betriebsverhalten erläutert und beschrieben, wo weitere Informationen zum Erstellen neuer Verhaltensweisen zu finden sind. Während einige Verhaltensweisen als Attribute angewendet werden, werden viele mithilfe einer Anwendungskonfigurationsdatei oder programmgesteuert angewendet. Weitere Informationen zum Konfigurieren Ihrer Dienstanwendung finden Sie unter Konfigurieren von Diensten.

Überblick

Der Vertrag definiert die Eingaben, Ausgaben, Datentypen und Funktionen eines Diensts dieses Typs. Durch die Implementierung eines Dienstvertrags wird eine Klasse erstellt, die bei der Konfiguration mit einer Bindung an einer Adresse den von ihr implementierten Vertrag erfüllt. Vertragliche, verbindliche und Adressinformationen sind alle vom Kunden bekannt; ohne sie kann der Client den Dienst nicht nutzen.

Vorgangsspezifische Vorgänge, z. B. Threadingprobleme oder Instanzverwaltung, sind jedoch für Clients nicht transparent. Nachdem Sie Ihren Servicevertrag implementiert haben, können Sie eine große Anzahl von Vorgangsmerkmalen mithilfe von Verhalten konfigurieren. Verhalten sind Objekte, die die Windows Communication Foundation (WCF)-Laufzeit ändern, indem sie entweder eine Laufzeiteigenschaft festlegen oder einen Anpassungstyp in die Laufzeit einfügen. Weitere Informationen zum Ändern der Laufzeit durch Erstellen benutzerdefinierter Verhaltensweisen finden Sie unter "Erweitern von ServiceHost" und "Service Model Layer".

Die System.ServiceModel.ServiceBehaviorAttribute Und System.ServiceModel.OperationBehaviorAttribute Attribute sind die am häufigsten nützlichen Verhaltensweisen und machen die am häufigsten angeforderten Vorgangsfeatures verfügbar. Da sie Attribute sind, wenden Sie sie auf die Dienst- oder Vorgangsimplementierung an. Andere Verhaltensweisen, wie z. B. System.ServiceModel.Description.ServiceMetadataBehavior oder System.ServiceModel.Description.ServiceDebugBehavior, werden typischerweise mithilfe einer Anwendungskonfigurationsdatei angewendet, obwohl Sie sie programmgesteuert verwenden können.

In diesem Thema finden Sie eine Übersicht über die ServiceBehaviorAttribute Attribute und OperationBehaviorAttribute Anwendungsbereiche, in denen Verhalten ausgeführt werden können, sowie eine kurze Beschreibung vieler vom System bereitgestellter Verhalten in den verschiedenen Anwendungsbereichen, die für WCF-Entwickler von Interesse sein könnten.

ServiceBehaviorAttribute und OperationBehaviorAttribute

Die wichtigsten Verhaltensweisen sind die ServiceBehaviorAttribute und OperationBehaviorAttribute Attribute, die Sie zum Steuern verwenden können:

  • Lebensdauer einer Instanz

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

  • Konfigurationsverhalten

  • Transaktionsverhalten

  • Serialisierungsverhalten

  • Metadatentransformation

  • Sitzungslebensdauer

  • Adressfilterung und Kopfzeilenverarbeitung

  • Nachahmung

  • Um diese Attribute zu verwenden, markieren Sie die Dienst- oder Vorgangsimplementierung mit dem Attribut, das für diesen Bereich geeignet ist, und legen Sie die Eigenschaften fest. Das folgende Codebeispiel zeigt eine Implementierung eines Vorgangs, die die Eigenschaft OperationBehaviorAttribute.Impersonation verwendet, um zu fordern, dass Aufrufer dieses Vorgangs den Identitätswechsel unterstützen.

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 der Eigenschaften erfordern zusätzliche Unterstützung durch die Bindung. Beispielsweise muss ein Vorgang, der eine Transaktion vom Client erfordert, so konfiguriert werden, dass eine Bindung verwendet wird, die flussierte Transaktionen unterstützt.

Bekannte Singleton-Dienste

Sie können die ServiceBehaviorAttribute und OperationBehaviorAttribute Attribute verwenden, um bestimmte Lebensdauern sowohl der InstanceContext als auch der Dienstobjekte, die die Vorgänge implementieren, zu steuern.

Beispielsweise steuern die ServiceBehaviorAttribute.InstanceContextMode Eigenschaften, wie oft die InstanceContext veröffentlicht wird, und die OperationBehaviorAttribute.ReleaseInstanceMode und ServiceBehaviorAttribute.ReleaseServiceInstanceOnTransactionComplete Eigenschaften steuern, wann das Dienstobjekt freigegeben wird.

Sie können jedoch auch selbst ein Dienstobjekt erstellen und den Diensthost mithilfe dieses Objekts erstellen. Dazu müssen Sie auch die Eigenschaft ServiceBehaviorAttribute.InstanceContextMode auf Single festlegen, ansonsten wird eine Ausnahme ausgelöst, wenn der Diensthost geöffnet wird.

Verwenden Sie den ServiceHost(Object, Uri[]) Konstruktor, um einen solchen Dienst zu erstellen. 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 schwer zu konstruieren ist (z. B. wenn er keinen parameterlosen öffentlichen Konstruktor implementiert).

Beachten Sie, dass, wenn ein Objekt an diesen Konstruktor übergeben wird, einige Features in Bezug auf das Instanzierungsverhalten der Windows Communication Foundation (WCF) anders funktionieren. Beispielsweise hat der Aufruf InstanceContext.ReleaseServiceInstance keine Auswirkung, 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.

Sonstiges Dienst-, Endpunkt-, Vertrags- und Vorgangsverhalten

Dienstverhalten, z. B. das ServiceBehaviorAttribute Attribut, werden über einen gesamten Dienst hinweg ausgeführt. Wenn Sie beispielsweise die Eigenschaft ServiceBehaviorAttribute.ConcurrencyMode auf ConcurrencyMode.Multiple festlegen, müssen Sie die Probleme mit der Threadsynchronisierung innerhalb der Vorgänge in diesem Dienst selbst behandeln. Endpunktverhalten wird über einen Endpunkt hinweg ausgeführt; viele der vom System bereitgestellten Endpunktverhalten sind für Clientfunktionen vorgesehen. Vertragsverhaltensweisen werden auf Vertragsebene ausgeführt, und Betriebsverhaltensweisen modifizieren die Durchführung von Vorgängen.

Viele dieser Verhaltensmuster werden auf Attributen implementiert, und Sie verwenden diese wie die ServiceBehaviorAttribute- und OperationBehaviorAttribute-Attribute, indem Sie sie auf die entsprechende Dienstklasse oder Operationenimplementierung anwenden. Andere Verhaltensweisen, wie etwa die Objekte ServiceMetadataBehavior oder ServiceDebugBehavior, werden normalerweise mithilfe einer Anwendungskonfigurationsdatei angewendet, obwohl sie auch programmgesteuert verwendet werden können.

Beispielsweise wird die Veröffentlichung von Metadaten mithilfe des ServiceMetadataBehavior Objekts konfiguriert. Die folgende Anwendungskonfigurationsdatei zeigt die am häufigsten verwendete Verwendung.

<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 Verhaltensweisen beschrieben, mit denen Sie die Laufzeitbereitstellung Ihres Diensts oder Clients ändern können. Informationen dazu, wie Sie jedes Element verwenden, finden Sie im verwandten Thema.

Dienstverhalten

Die folgenden Verhaltensweisen wirken bei Diensten.

Endpunktverhalten

Die folgenden Verhaltensweisen werden auf Endpunkten ausgeführt. Viele dieser Verhaltensweisen 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 Authentifizierungseinstellungen der Dienstanmeldeinformationen für die Verwendung auf dem Client 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 MustUnderstand Verarbeitung 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 Featureanforderungen an, die Bindungen für den Dienst oder die Clientimplementierung bereitstellen müssen.

Betriebsverhalten

Das folgende Betriebsverhalten spezifiziert Serialisierungs- und Transaktionskontrollen für Operationen.

Siehe auch