Dela via


Specifikation av tjänst Run-Time beteende

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.

Operationsspecifika detaljer, såsom 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 Windows Communication Foundation (WCF) körinstans genom att antingen ange en körningsegenskap eller genom att infoga en anpassningstyp i körinstansen. För mer information om hur du ändrar körtiden genom att definiera användaranpassade beteenden, se 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

  • Metadata-transformation

  • Sessionslivslängd

  • Bearbetning av adressfiltrering och sidhuvud

  • Falsk identitet

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

Well-Known Singleton Services

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.

Till exempel styr egenskapen ServiceBehaviorAttribute.InstanceContextMode hur ofta InstanceContext frisläpps, och egenskaperna OperationBehaviorAttribute.ReleaseInstanceMode 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å kommer ett undantag att utlösas 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-instansieringsbeteende (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 instanssläppmekanismer. Klassen ServiceHost beter sig alltid som om egenskapen OperationBehaviorAttribute.ReleaseInstanceMode är inställd på ReleaseInstanceMode.None för alla åtgärder.

Andra beteenden för tjänst, slutpunkt, kontrakt och operation

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 av ServiceMetadataBehavior-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 beskriver många av de mest användbara systemtillhandahållna beteenden som du kan använda för att ändra realtidsleveransen av 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.

Ändpunktsbeteenden

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 callback-objekt.

  • 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 MustUnderstand-bearbetningen.

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

  • TransactedBatchingBehavior. Optimerar mottagningsoperationerna för transporter som stödjer 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