Dela via


Ange körningsbeteende för tjänsten

När du har utformat ett tjänstkontrakt (utforma tjänstkontrakt) och implementerat tjänstkontraktet (implementera tjänstkontrakt) kan du konfigurera driftbeteendet för tjänstkörningen. I det här avsnittet beskrivs funktioner för tjänster och åtgärder som tillhandahålls av systemet och beskriver var du hittar mer information för att skapa nya beteenden. Vissa beteenden tillämpas som attribut, men många tillämpas med hjälp av en programkonfigurationsfil eller programmatiskt. Mer information om hur du konfigurerar tjänstprogrammet finns i Konfigurera tjänster.

Översikt

Kontraktet definierar indata, utdata, datatyper och funktioner för en tjänst av den typen. När du implementerar ett tjänstkontrakt skapas en klass som, när den konfigureras med en bindning på en adress, uppfyller det kontrakt som implementeras. Avtals-, bindnings- och adressinformation är alla kända av klienten; utan dem kan klienten inte använda tjänsten.

Åtgärdsspecifika åtgärder, till exempel trådningsproblem eller instanshantering, är dock ogenomskinliga för klienter. När du har implementerat tjänstkontraktet kan du konfigurera ett stort antal åtgärdsegenskaper med hjälp av beteenden. Beteenden är objekt som ändrar WCF-körningen (Windows Communication Foundation) genom att antingen ange en körningsegenskap eller genom att infoga en anpassningstyp i körningen. Mer information om hur du ändrar körningen genom att skapa användardefinierade beteenden finns i Utöka ServiceHost och Service Model Layer.

Attributen System.ServiceModel.ServiceBehaviorAttribute och System.ServiceModel.OperationBehaviorAttribute är de mest användbara beteendena och exponerar de vanligaste åtgärdsfunktionerna. Eftersom de är attribut tillämpar du dem på tjänst- eller åtgärdsimplementeringen. Andra beteenden, till exempel System.ServiceModel.Description.ServiceMetadataBehavior eller System.ServiceModel.Description.ServiceDebugBehavior, används vanligtvis med hjälp av en programkonfigurationsfil, även om du kan använda dem programmatiskt.

Det här avsnittet innehåller en översikt över attributen ServiceBehaviorAttribute och OperationBehaviorAttribute , beskriver de olika omfång där beteenden kan fungera och ger en snabb beskrivning av många av de systemspecifika beteendena i de olika omfång som kan vara av intresse för WCF-utvecklare.

ServiceBehaviorAttribute och OperationBehaviorAttribute

De viktigaste beteendena är attributen ServiceBehaviorAttribute och OperationBehaviorAttribute som du kan använda för att styra:

  • Instansens livslängd

  • Stöd för samtidighet och synkronisering

  • Konfigurationsbeteende

  • Transaktionsbeteende

  • Serialiseringsbeteende

  • Metadatatransformering

  • Sessionslivslängd

  • Bearbetning av adressfiltrering och sidhuvud

  • Personifiering

  • Om du vill använda dessa attribut markerar du tjänst- eller åtgärdsimplementeringen med det attribut som är lämpligt för det omfånget och anger egenskaperna. I följande kodexempel visas till exempel en åtgärdsimplementering som använder OperationBehaviorAttribute.Impersonation egenskapen för att kräva att anropare av den här åtgärden stöder personifiering.

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

Många av egenskaperna kräver ytterligare stöd från bindningen. Till exempel måste en åtgärd som kräver en transaktion från klienten konfigureras för att använda en bindning som stöder flödestransaktioner.

Välkända Singleton-tjänster

Du kan använda attributen ServiceBehaviorAttribute och OperationBehaviorAttribute för att styra vissa livslängder, både för InstanceContext och för de tjänstobjekt som implementerar åtgärderna.

Egenskapen styr till exempel ServiceBehaviorAttribute.InstanceContextMode hur ofta frisläpps InstanceContext och OperationBehaviorAttribute.ReleaseInstanceMode egenskaperna och ServiceBehaviorAttribute.ReleaseServiceInstanceOnTransactionComplete styr när tjänstobjektet släpps.

Men du kan också skapa ett tjänstobjekt själv och skapa tjänstvärden med det objektet. Om du vill göra det måste du också ange ServiceBehaviorAttribute.InstanceContextMode egenskapen till Single eller så utlöses ett undantag när tjänstvärden öppnas.

ServiceHost(Object, Uri[]) Använd konstruktorn för att skapa en sådan tjänst. Det är ett alternativ till att implementera en anpassad System.ServiceModel.Dispatcher.IInstanceContextInitializer när du vill ange en specifik objektinstans för användning av en singleton-tjänst. Du kan använda den här överbelastningen när din tjänstimplementeringstyp är svår att konstruera (till exempel om den inte implementerar en parameterlös offentlig konstruktor).

Observera att när ett objekt tillhandahålls till den här konstruktorn fungerar vissa funktioner relaterade till WCF-beteendet (Windows Communication Foundation) på ett annat sätt. Anrop InstanceContext.ReleaseServiceInstance har till exempel ingen effekt när en välkänd objektinstans tillhandahålls. På samma sätt ignoreras alla andra instansversionsmekanismer. Klassen ServiceHost beter sig alltid som om egenskapen OperationBehaviorAttribute.ReleaseInstanceMode är inställd på ReleaseInstanceMode.None för alla åtgärder.

Andra funktioner för tjänst, slutpunkt, kontrakt och åtgärd

Tjänstbeteenden, till exempel ServiceBehaviorAttribute attributet, fungerar i en hel tjänst. Om du till exempel ställer in ServiceBehaviorAttribute.ConcurrencyMode egenskapen på ConcurrencyMode.Multiple måste du hantera problem med trådsynkronisering i varje åtgärd i den tjänsten själv. Slutpunktsbeteenden fungerar över en slutpunkt. många av de systemspecifika slutpunktsbeteendena gäller klientfunktioner. Kontraktsbeteenden fungerar på kontraktsnivå och driftbeteenden ändrar åtgärdsleveransen.

Många av dessa beteenden implementeras på attribut och du använder dem när du gör attributen ServiceBehaviorAttribute och OperationBehaviorAttribute – genom att tillämpa dem på lämplig tjänstklass eller åtgärdsimplementering. Andra beteenden, till exempel objekten ServiceMetadataBehavior eller ServiceDebugBehavior , tillämpas vanligtvis med hjälp av en programkonfigurationsfil, även om de också kan användas programmatiskt.

Till exempel konfigureras publiceringen av metadata med hjälp ServiceMetadataBehavior av objektet. Följande programkonfigurationsfil visar den vanligaste användningen.

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

I följande avsnitt beskrivs många av de mest användbara systemspecifika beteenden som du kan använda för att ändra körningsleveransen för din tjänst eller klient. Se referensavsnittet för att avgöra hur var och en ska användas.

Tjänstbeteenden

Följande beteenden fungerar på tjänster.

Slutpunktsbeteenden

Följande beteenden fungerar på slutpunkter. Många av dessa beteenden används i klientprogram.

  • CallbackBehaviorAttribute. Konfigurerar en implementering av återanropstjänsten i ett duplex-klientprogram.

  • CallbackDebugBehavior. Aktiverar tjänstfelsökning för ett WCF-motringningsobjekt.

  • ClientCredentials. Tillåter att användaren konfigurerar klient- och tjänstautentiseringsuppgifter samt autentiseringsinställningar för tjänstautentiseringsuppgifter för användning på klienten.

  • ClientViaBehavior. Används av klienter för att ange den URI (Uniform Resource Identifier) som transportkanalen ska skapas för.

  • MustUnderstandBehavior. Instruerar WCF att inaktivera bearbetningen MustUnderstand .

  • SynchronousReceiveBehavior. Instruerar körningen att använda en synkron mottagningsprocess för kanaler.

  • TransactedBatchingBehavior. Optimerar mottagningsåtgärderna för transporter som stöder transaktionella mottagningar.

Kontraktsbeteenden

DeliveryRequirementsAttribute. Anger de funktionskrav som bindningar måste tillhandahålla till tjänsten eller klientimplementeringen.

Åtgärdsbeteenden

Följande åtgärdsbeteenden anger serialiserings- och transaktionskontroller för åtgärder.

Se även