Delen via


Runtimegedrag van de service opgeven

Zodra u een servicecontract hebt ontworpen (Servicecontracten ontwerpen) en uw servicecontract hebt geïmplementeerd (Servicecontracten implementeren) kunt u het werkingsgedrag van de serviceruntime configureren. In dit onderwerp worden door het systeem geleverde service- en bewerkingsgedrag besproken en wordt beschreven waar u meer informatie kunt vinden om nieuw gedrag te maken. Hoewel sommige gedragingen worden toegepast als kenmerken, worden veel toegepast met behulp van een toepassingsconfiguratiebestand of programmatisch. Zie Services configureren voor meer informatie over het configureren van uw servicetoepassing.

Overzicht

Het contract definieert de invoer, uitvoer, gegevenstypen en mogelijkheden van een service van dat type. Het implementeren van een servicecontract maakt een klasse die, wanneer deze is geconfigureerd met een binding op een adres, voldoet aan het contract dat wordt geïmplementeerd. Contractuele, bindende en adresgegevens zijn allemaal bekend door de klant; zonder deze services kan de client geen gebruik maken van de service.

Bewerkingsspecifieke gegevens, zoals threadingproblemen of exemplaarbeheer, zijn echter ondoorzichtig voor clients. Zodra u uw servicecontract hebt geïmplementeerd, kunt u een groot aantal bewerkingskenmerken configureren met behulp van gedrag. Gedrag is objecten die de WCF-runtime (Windows Communication Foundation) wijzigen door een runtime-eigenschap in te stellen of door een aanpassingstype in te voegen in de runtime. Zie Uitbreiden van ServiceHost en de servicemodellaag voor meer informatie over het wijzigen van de runtime door het maken van door de gebruiker gedefinieerd gedrag.

De System.ServiceModel.ServiceBehaviorAttribute kenmerken en System.ServiceModel.OperationBehaviorAttribute kenmerken zijn het meest nuttige gedrag en maken de meest aangevraagde bewerkingsfuncties beschikbaar. Omdat het kenmerken zijn, past u deze toe op de implementatie van de service of bewerking. Andere gedragingen, zoals de System.ServiceModel.Description.ServiceMetadataBehavior of System.ServiceModel.Description.ServiceDebugBehavior, worden meestal toegepast met behulp van een toepassingsconfiguratiebestand, hoewel u ze programmatisch kunt gebruiken.

In dit onderwerp vindt u een overzicht van de ServiceBehaviorAttribute kenmerken en OperationBehaviorAttribute kenmerken, worden de verschillende bereiken beschreven waarop gedrag kan worden uitgevoerd en wordt een korte beschrijving gegeven van veel van het door het systeem geleverde gedrag op de verschillende bereiken die mogelijk interessant zijn voor WCF-ontwikkelaars.

ServiceBehaviorAttribute en OperationBehaviorAttribute

Het belangrijkste gedrag is de ServiceBehaviorAttribute en OperationBehaviorAttribute kenmerken die u kunt gebruiken om het volgende te beheren:

  • Levensduur van exemplaren

  • Ondersteuning voor gelijktijdigheid en synchronisatie

  • Configuratiegedrag

  • Transactiegedrag

  • Serialisatiegedrag

  • Metagegevenstransformatie

  • Levensduur van sessie

  • Adresfilters en headerverwerking

  • Imitatie

  • Als u deze kenmerken wilt gebruiken, markeert u de implementatie van de service of bewerking met het kenmerk dat geschikt is voor dat bereik en stelt u de eigenschappen in. In het volgende codevoorbeeld ziet u bijvoorbeeld een implementatie van een bewerking die gebruikmaakt van de OperationBehaviorAttribute.Impersonation eigenschap om te vereisen dat bellers van deze bewerking imitatie ondersteunen.

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

Veel van de eigenschappen vereisen extra ondersteuning van de binding. Een bewerking waarvoor een transactie van de client is vereist, moet bijvoorbeeld worden geconfigureerd voor het gebruik van een binding die stroomtransacties ondersteunt.

Bekende Singleton Services

U kunt de ServiceBehaviorAttribute en OperationBehaviorAttribute kenmerken gebruiken om bepaalde levensduuren te beheren, zowel van de InstanceContext als van de serviceobjecten die de bewerkingen implementeren.

De ServiceBehaviorAttribute.InstanceContextMode eigenschap bepaalt bijvoorbeeld hoe vaak de InstanceContext vrijgegeven wordt en het OperationBehaviorAttribute.ReleaseInstanceMode eigenschappenbesturingselement ServiceBehaviorAttribute.ReleaseServiceInstanceOnTransactionComplete wanneer het serviceobject wordt vrijgegeven.

U kunt echter ook zelf een serviceobject maken en de servicehost maken met behulp van dat object. Hiervoor moet u ook de ServiceBehaviorAttribute.InstanceContextMode eigenschap Single instellen op of een uitzondering wordt gegenereerd wanneer de servicehost wordt geopend.

Gebruik de ServiceHost(Object, Uri[]) constructor om een dergelijke service te maken. Het biedt een alternatief voor het implementeren van een aangepast exemplaar wanneer u een specifiek objectexemplaren System.ServiceModel.Dispatcher.IInstanceContextInitializer wilt opgeven voor gebruik door een singleton-service. U kunt deze overbelasting gebruiken wanneer uw serviceimplementatietype moeilijk te bouwen is (bijvoorbeeld als er geen openbare constructor zonder parameter wordt geïmplementeerd).

Houd er rekening mee dat wanneer een object aan deze constructor wordt verstrekt, sommige functies met betrekking tot het gedrag van Windows Communication Foundation (WCF) anders werken. Het aanroepen InstanceContext.ReleaseServiceInstance heeft bijvoorbeeld geen effect wanneer een bekend objectexemplaren wordt opgegeven. Op dezelfde manier wordt elk ander releasemechanisme voor exemplaren genegeerd. De ServiceHost klasse gedraagt zich altijd alsof de OperationBehaviorAttribute.ReleaseInstanceMode eigenschap is ingesteld ReleaseInstanceMode.None op alle bewerkingen.

Ander gedrag van service, eindpunt, contract en bewerking

Servicegedrag, zoals het ServiceBehaviorAttribute kenmerk, werkt voor een hele service. Als u de ServiceBehaviorAttribute.ConcurrencyMode eigenschap bijvoorbeeld instelt op ConcurrencyMode.Multiple u problemen met threadsynchronisatie in elke bewerking in die service zelf moet afhandelen. Eindpuntgedrag werkt voor een eindpunt; veel van het door het systeem geleverde eindpuntgedrag zijn voor clientfunctionaliteit. Contractgedrag werkt op contractniveau en bewerkingsgedrag wijzigt de levering van bewerkingen.

Veel van deze gedragingen worden geïmplementeerd op kenmerken en u maakt er gebruik van zoals u dat ServiceBehaviorAttribute doet en OperationBehaviorAttribute kenmerken, door ze toe te passen op de juiste serviceklasse of de juiste implementatie van bewerkingen. Andere gedragingen, zoals de ServiceMetadataBehavior of ServiceDebugBehavior objecten, worden meestal toegepast met behulp van een toepassingsconfiguratiebestand, hoewel ze ook programmatisch kunnen worden gebruikt.

De publicatie van metagegevens wordt bijvoorbeeld geconfigureerd met behulp van het ServiceMetadataBehavior object. In het volgende toepassingsconfiguratiebestand ziet u het meest voorkomende gebruik.

<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 de volgende secties worden veel van de nuttigste door het systeem geleverde gedragingen beschreven die u kunt gebruiken om de runtimelevering van uw service of client te wijzigen. Zie het naslagonderwerp om te bepalen hoe u elk onderwerp gebruikt.

Servicegedrag

Het volgende gedrag werkt op services.

Eindpuntgedrag

Het volgende gedrag werkt op eindpunten. Veel van deze gedragingen worden gebruikt in clienttoepassingen.

  • CallbackBehaviorAttribute. Hiermee configureert u een callback-service-implementatie in een duplex-clienttoepassing.

  • CallbackDebugBehavior. Hiermee schakelt u serviceopsporing in voor een WCF-callback-object.

  • ClientCredentials. Hiermee kan de gebruiker client- en servicereferenties configureren, evenals verificatie-instellingen voor servicereferenties voor gebruik op de client.

  • ClientViaBehavior. Wordt door clients gebruikt om de URI (Uniform Resource Identifier) op te geven waarvoor het transportkanaal moet worden gemaakt.

  • MustUnderstandBehavior. Hiermee wordt WCF geïnstrueerd om de MustUnderstand verwerking uit te schakelen.

  • SynchronousReceiveBehavior. Hiermee geeft u de runtime de opdracht om een synchroon ontvangstproces voor kanalen te gebruiken.

  • TransactedBatchingBehavior. Optimaliseert de ontvangstbewerkingen voor transporten die ondersteuning bieden voor transactionele ontvangst.

Contractgedrag

DeliveryRequirementsAttribute. Hiermee geeft u de functievereisten op die bindingen moeten bieden aan de service- of client-implementatie.

Werkingsgedrag

In het volgende bewerkingsgedrag worden serialisatie- en transactiebesturingselementen voor bewerkingen opgegeven.

Zie ook