Určování chování služby za běhu

Jakmile navrhnete kontrakt služby (návrh kontraktů služeb) a implementujete kontrakt služby (implementace kontraktů služeb), můžete nakonfigurovat chování operace modulu runtime služby. Toto téma popisuje chování služeb a operací poskytované systémem a popisuje, kde najít další informace o vytváření nových chování. I když se některé chování používá jako atributy, mnoho z nich se používá pomocí konfiguračního souboru aplikace nebo programově. Další informace o konfiguraci aplikace služby naleznete v tématu Konfigurace služeb.

Přehled

Kontrakt definuje vstupy, výstupy, datové typy a možnosti služby tohoto typu. Implementace kontraktu služby vytvoří třídu, která při konfiguraci vazby na adrese splní kontrakt, který implementuje. Smluvní, závazné a adresní informace jsou všechny známy klientem; bez nich nemůže klient službu využívat.

Specifické operace, jako jsou problémy s vlákny nebo správa instancí, jsou však pro klienty neprůhlené. Po implementaci kontraktu služby můžete pomocí chování nakonfigurovat velký počet charakteristik operací. Chování jsou objekty, které upravují modul runtime WCF (Windows Communication Foundation) nastavením vlastnosti modulu runtime nebo vložením typu přizpůsobení do modulu runtime. Další informace o úpravě modulu runtime vytvořením uživatelem definovaného chování naleznete v tématu Rozšíření ServiceHost a vrstvy modelu služby.

System.ServiceModel.OperationBehaviorAttribute Atributy System.ServiceModel.ServiceBehaviorAttribute jsou nejužitečnější chování a zveřejňují nejčastěji požadované funkce operací. Vzhledem k tomu, že jsou atributy, použijete je na implementaci služby nebo operace. Jiné chování, jako System.ServiceModel.Description.ServiceMetadataBehavior je například nebo System.ServiceModel.Description.ServiceDebugBehavior, se obvykle používá pomocí konfiguračního souboru aplikace, i když je můžete použít programově.

Toto téma obsahuje přehled ServiceBehaviorAttributeOperationBehaviorAttribute a atributy, popisuje různé obory, ve kterých může fungovat chování, a poskytuje stručný popis mnoha systémově zadaných chování v různých oborech, které můžou být pro vývojáře WCF zajímavé.

ServiceBehaviorAttribute a OperationBehaviorAttribute

Nejdůležitější chování jsou vlastnosti ServiceBehaviorAttribute a OperationBehaviorAttribute atributy, které můžete použít k řízení:

  • Životnost instancí

  • Podpora souběžnosti a synchronizace

  • Chování konfigurace

  • Chování transakcí

  • Chování serializace

  • Transformace metadat

  • Životnost relace

  • Filtrování adres a zpracování hlaviček

  • Zosobnění

  • Pokud chcete tyto atributy použít, označte implementaci služby nebo operace atributem odpovídajícím danému oboru a nastavte vlastnosti. Následující příklad kódu například ukazuje implementaci operace, která používá OperationBehaviorAttribute.Impersonation vlastnost, která vyžaduje, aby volající této operace podporoval zosobnění.

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

Mnoho vlastností vyžaduje další podporu vazby. Například operace, která vyžaduje transakci z klienta, musí být nakonfigurována tak, aby používala vazbu, která podporuje tok transakce.

Známé služby Singleton

Pomocí atributů můžete ServiceBehaviorAttributeOperationBehaviorAttribute řídit určité životnosti, a to jak InstanceContext objekty služby, které implementují operace.

Například vlastnost řídí, ServiceBehaviorAttribute.InstanceContextMode jak často InstanceContext je vydána, a OperationBehaviorAttribute.ReleaseInstanceMode vlastnosti řízení ServiceBehaviorAttribute.ReleaseServiceInstanceOnTransactionComplete při uvolnění objektu služby.

Můžete ale také vytvořit objekt služby sami a vytvořit hostitele služby pomocí daného objektu. Chcete-li to provést, musíte také nastavit ServiceBehaviorAttribute.InstanceContextMode vlastnost na Single nebo výjimku je vyvolán při otevření hostitele služby.

Pomocí konstruktoru ServiceHost(Object, Uri[]) vytvořte takovou službu. Poskytuje alternativu k implementaci vlastního System.ServiceModel.Dispatcher.IInstanceContextInitializer objektu, pokud chcete poskytnout konkrétní instanci objektu pro použití službou singleton. Toto přetížení můžete použít, pokud je typ implementace služby obtížné sestavit (například pokud neimplementuje veřejný konstruktor bez parametrů).

Všimněte si, že když je objekt poskytnut tomuto konstruktoru, některé funkce související s chováním instance Wcf (Windows Communication Foundation) fungují odlišně. Volání například nemá žádný vliv, InstanceContext.ReleaseServiceInstance pokud je k dispozici dobře známá instance objektu. Podobně se ignoruje jakýkoli jiný mechanismus uvolnění instance. Třída ServiceHost se vždy chová, jako by OperationBehaviorAttribute.ReleaseInstanceMode vlastnost byla nastavena ReleaseInstanceMode.None pro všechny operace.

Jiné chování služby, koncového bodu, kontraktu a operace

Chování služeb, jako ServiceBehaviorAttribute je například atribut, funguje napříč celou službou. Pokud například nastavíte vlastnost na ConcurrencyMode.Multiple hodnotuServiceBehaviorAttribute.ConcurrencyMode, musíte zpracovat problémy se synchronizací vláken uvnitř každé operace v této službě sami. Chování koncových bodů funguje napříč koncovým bodem; Řada chování koncových bodů poskytovaných systémem je určená pro funkce klienta. Chování kontraktů funguje na úrovni kontraktu a chování operací mění doručení operace.

Mnoho z těchto chování se implementuje u atributů a používáte je při provádění ServiceBehaviorAttribute a OperationBehaviorAttribute atributů – tím, že je použijete na příslušnou třídu služby nebo implementaci operace. Jiné chování, jako ServiceMetadataBehavior jsou například objekty ServiceDebugBehavior , se obvykle používají pomocí konfiguračního souboru aplikace, i když je lze použít také programově.

Publikování metadat je například nakonfigurováno pomocí objektu ServiceMetadataBehavior . Následující konfigurační soubor aplikace ukazuje nejběžnější využití.

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

Následující části popisují řadu nejužitečnějších systémových chování, které můžete použít k úpravě doručení služby nebo klienta za běhu. V referenčním tématu se dozvíte, jak jednotlivé typy používat.

Chování služby

Následující chování funguje se službami.

Chování koncových bodů

Následující chování funguje na koncových bodech. Mnoho z těchto chování se používá v klientských aplikacích.

  • CallbackBehaviorAttribute. Nakonfiguruje implementaci služby zpětného volání v duplexní klientské aplikaci.

  • CallbackDebugBehavior. Povolí ladění služby pro objekt zpětného volání WCF.

  • ClientCredentials. Umožňuje uživateli nakonfigurovat přihlašovací údaje klienta a služby a také nastavení ověřování přihlašovacích údajů služby pro použití v klientovi.

  • ClientViaBehavior. Klienti používají k určení identifikátoru URI (Uniform Resource Identifier), pro který má být vytvořen přenosový kanál.

  • MustUnderstandBehavior. Dává WCF pokyn, aby zakázal MustUnderstand zpracování.

  • SynchronousReceiveBehavior. Dává modulu runtime pokyn, aby pro kanály používal synchronní proces příjmu.

  • TransactedBatchingBehavior. Optimalizuje operace příjmu pro přenosy, které podporují příjem transakcí.

Chování kontraktů

DeliveryRequirementsAttribute. Určuje požadavky na funkce, které vazby musí poskytovat pro implementaci služby nebo klienta.

Chování operací

Následující chování operací určuje serializace a ovládací prvky transakcí pro operace.

Viz také