Określanie zachowania środowiska uruchomieniowego usługi

Po zaprojektowaniu kontraktu usługi (projektowanie kontraktów usług) i zaimplementowaniu kontraktu usługi (Implementowanie kontraktów usług) można skonfigurować działanie środowiska uruchomieniowego usługi. W tym temacie omówiono zachowania usług i operacji zapewnianych przez system oraz opisano, gdzie znaleźć więcej informacji na temat tworzenia nowych zachowań. Podczas gdy niektóre zachowania są stosowane jako atrybuty, wiele z nich jest stosowana przy użyciu pliku konfiguracji aplikacji lub programowo. Aby uzyskać więcej informacji na temat konfigurowania aplikacji usługi, zobacz Konfigurowanie usług.

Omówienie

Kontrakt definiuje dane wejściowe, dane wyjściowe, typy danych i możliwości usługi tego typu. Implementowanie kontraktu usługi tworzy klasę, która po skonfigurowaniu przy użyciu powiązania na adresie spełnia kontrakt, który implementuje. Informacje o umowie, powiązaniu i adresie są znane przez klienta; bez nich klient nie może korzystać z usługi.

Jednak specyficzne dla operacji, takie jak problemy z wątkami lub zarządzanie wystąpieniami, są nieprzezroczyste dla klientów. Po zaimplementowaniu kontraktu usługi można skonfigurować dużą liczbę cech operacji przy użyciu zachowań. Zachowania to obiekty modyfikujące środowisko uruchomieniowe programu Windows Communication Foundation (WCF), ustawiając właściwość środowiska uruchomieniowego lub wstawiając typ dostosowywania do środowiska uruchomieniowego. Aby uzyskać więcej informacji na temat modyfikowania środowiska uruchomieniowego przez tworzenie zachowań zdefiniowanych przez użytkownika, zobacz Rozszerzanie elementu ServiceHost i warstwy modelu usługi.

Atrybuty System.ServiceModel.ServiceBehaviorAttribute i System.ServiceModel.OperationBehaviorAttribute są najczęściej przydatnymi zachowaniami i uwidaczniają najczęściej żądane funkcje operacji. Ponieważ są to atrybuty, należy je zastosować do implementacji usługi lub operacji. Inne zachowania, takie jak System.ServiceModel.Description.ServiceMetadataBehavior lub System.ServiceModel.Description.ServiceDebugBehavior, są zwykle stosowane przy użyciu pliku konfiguracji aplikacji, chociaż można ich używać programowo.

W tym temacie omówiono ServiceBehaviorAttribute atrybuty i OperationBehaviorAttribute , opisano różne zakresy, w których mogą działać zachowania, oraz krótki opis wielu zachowań udostępnianych przez system w różnych zakresach, które mogą być interesujące dla deweloperów programu WCF.

ServiceBehaviorAttribute i OperationBehaviorAttribute

Najważniejsze zachowania to ServiceBehaviorAttribute atrybuty i OperationBehaviorAttribute , których można użyć do kontrolowania:

  • Okresy istnienia wystąpień

  • Obsługa współbieżności i synchronizacji

  • Zachowanie konfiguracji

  • Zachowanie transakcji

  • Zachowanie serializacji

  • Przekształcanie metadanych

  • Okres istnienia sesji

  • Filtrowanie adresów i przetwarzanie nagłówków

  • Personifikacja

  • Aby użyć tych atrybutów, oznacz implementację usługi lub operacji za pomocą atrybutu odpowiedniego dla tego zakresu i ustaw właściwości. Na przykład poniższy przykład kodu przedstawia implementację operacji, która używa OperationBehaviorAttribute.Impersonation właściwości , aby wymagać personifikacji wywołań tej operacji.

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

Wiele właściwości wymaga dodatkowej obsługi powiązania. Na przykład operacja, która wymaga transakcji od klienta, musi być skonfigurowana tak, aby korzystała z powiązania obsługującego przepływane transakcje.

Dobrze znane usługi singleton

Można użyć ServiceBehaviorAttribute atrybutów i OperationBehaviorAttribute do kontrolowania określonych okresów istnienia, zarówno InstanceContext obiektów usługi, jak i, które implementują operacje.

Na przykład właściwość określa, ServiceBehaviorAttribute.InstanceContextMode jak często InstanceContext jest zwalniana, oraz kontrolkę OperationBehaviorAttribute.ReleaseInstanceMode właściwości i ServiceBehaviorAttribute.ReleaseServiceInstanceOnTransactionComplete po wydaniu obiektu usługi.

Można jednak samodzielnie utworzyć obiekt usługi i utworzyć hosta usługi przy użyciu tego obiektu. W tym celu należy również ustawić ServiceBehaviorAttribute.InstanceContextMode właściwość na Single lub zgłaszany jest wyjątek po otwarciu hosta usługi.

Użyj konstruktora ServiceHost(Object, Uri[]) , aby utworzyć taką usługę. Stanowi alternatywę dla implementacji niestandardowej System.ServiceModel.Dispatcher.IInstanceContextInitializer , gdy chcesz udostępnić określone wystąpienie obiektu do użycia przez pojedynczą usługę. Tego przeciążenia można użyć, gdy typ implementacji usługi jest trudny do skonstruowania (na przykład jeśli nie implementuje bez parametrów publicznego konstruktora).

Należy pamiętać, że gdy obiekt jest dostarczany do tego konstruktora, niektóre funkcje związane z zachowaniem instancingu programu Windows Communication Foundation (WCF) działają inaczej. Na przykład wywołanie InstanceContext.ReleaseServiceInstance nie ma wpływu, gdy podano dobrze znane wystąpienie obiektu. Podobnie każdy inny mechanizm wydawania wystąpień jest ignorowany. Klasa ServiceHost zawsze zachowuje się tak, jakby OperationBehaviorAttribute.ReleaseInstanceMode właściwość jest ustawiona ReleaseInstanceMode.None dla wszystkich operacji.

Inne zachowania usługi, punktu końcowego, kontraktu i operacji

Zachowania usługi, takie jak ServiceBehaviorAttribute atrybut, działają w całej usłudze. Jeśli na przykład ustawisz ServiceBehaviorAttribute.ConcurrencyMode właściwość na wartość , musisz samodzielnie obsługiwać ConcurrencyMode.Multiple problemy z synchronizacją wątków wewnątrz każdej operacji w tej usłudze. Zachowania punktów końcowych działają w obrębie punktu końcowego; wiele zachowań punktów końcowych udostępnianych przez system jest przeznaczonych dla funkcji klienta. Zachowania kontraktu działają na poziomie kontraktu, a zachowania operacji modyfikują dostarczanie operacji.

Wiele z tych zachowań jest implementowanych na atrybutach i używa się ServiceBehaviorAttribute ich w miarę wykonywania atrybutów i OperationBehaviorAttribute — stosując je do odpowiedniej klasy usługi lub implementacji operacji. Inne zachowania, takie jak ServiceMetadataBehavior obiekty lub ServiceDebugBehavior , są zwykle stosowane przy użyciu pliku konfiguracji aplikacji, chociaż mogą być również używane programowo.

Na przykład publikacja metadanych jest konfigurowana przy użyciu ServiceMetadataBehavior obiektu . Poniższy plik konfiguracji aplikacji przedstawia najbardziej typowe użycie.

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

W poniższych sekcjach opisano wiele z najbardziej przydatnych zachowań udostępnianych przez system, których można użyć do modyfikowania dostarczania środowiska uruchomieniowego usługi lub klienta. Zapoznaj się z tematem referencyjnym, aby określić, jak używać każdego z nich.

Zachowania usługi

Następujące zachowania działają na usługach.

Zachowania punktów końcowych

Następujące zachowania działają w punktach końcowych. Wiele z tych zachowań jest używanych w aplikacjach klienckich.

  • CallbackBehaviorAttribute. Konfiguruje implementację usługi wywołania zwrotnego w aplikacji klienckiej dwukierunkowej.

  • CallbackDebugBehavior. Włącza debugowanie usługi dla obiektu wywołania zwrotnego WCF.

  • ClientCredentials. Umożliwia użytkownikowi skonfigurowanie poświadczeń klienta i usługi oraz ustawień uwierzytelniania poświadczeń usługi do użycia na kliencie.

  • ClientViaBehavior. Używany przez klientów do określania identyfikatora URI ( Uniform Resource Identifier), dla którego ma zostać utworzony kanał transportu.

  • MustUnderstandBehavior. Nakazuje programowi WCF wyłączenie przetwarzania MustUnderstand .

  • SynchronousReceiveBehavior. Instruuje środowisko uruchomieniowe, aby używało synchronicznego procesu odbierania dla kanałów.

  • TransactedBatchingBehavior. Optymalizuje operacje odbierania dla transportu, które obsługują odbieranie transakcyjne.

Zachowania kontraktu

DeliveryRequirementsAttribute. Określa wymagania dotyczące funkcji, które powiązania muszą dostarczyć do usługi lub implementacji klienta.

Zachowania operacji

Następujące zachowania operacji określają serializacji i kontrolek transakcji dla operacji.

Zobacz też