Udostępnij przez


Określanie zachowania usługi Run-Time

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.

Przegląd

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 za pomocą powiązania z adresem 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 szczegóły operacji, takie jak problemy z wątkami lub zarządzanie wystąpieniami, są niejawne dla klientów. Po zaimplementowaniu kontraktu usługi można skonfigurować dużą liczbę cech operacji przy użyciu zachowań. Zachowania to obiekty, które modyfikują środowisko uruchomieniowe Windows Communication Foundation (WCF) poprzez ustawienie właściwości tego środowiska lub wprowadzenie typu modyfikacji do samego środowiska. 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 atrybuty ServiceBehaviorAttribute i OperationBehaviorAttribute, opisano różne zakresy, w których mogą działać zachowania, oraz podano krótki opis wielu zachowań dostarczanych przez system w różnych zakresach, które mogą zainteresować deweloperów WCF.

ServiceBehaviorAttribute i OperationBehaviorAttribute

Najważniejsze zachowania to atrybuty ServiceBehaviorAttribute 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 właściwości OperationBehaviorAttribute.Impersonation, aby wymagać, że wywołujący tę operację obsługują podszywanie się.

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 singletonu

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

Na przykład właściwość ServiceBehaviorAttribute.InstanceContextMode określa, jak często InstanceContext jest zwalniana, a właściwości OperationBehaviorAttribute.ReleaseInstanceMode i ServiceBehaviorAttribute.ReleaseServiceInstanceOnTransactionComplete kontrolują, kiedy obiekt usługi jest zwalniany.

Można jednak samodzielnie utworzyć obiekt usługi i utworzyć hosta usługi przy użyciu tego obiektu. Aby to zrobić, należy również ustawić właściwość ServiceBehaviorAttribute.InstanceContextMode na Single, w przeciwnym razie zostanie zgłoszony 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 usługę singleton. Możesz użyć tego przeciążenia, gdy typ implementacji usługi jest trudny do skonstruowania (na przykład, jeśli nie implementuje publicznego konstruktora bez parametrów).

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 właściwość OperationBehaviorAttribute.ReleaseInstanceMode była ustawiona na ReleaseInstanceMode.None dla wszystkich operacji.

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

Zachowania usługi, takie jak atrybut ServiceBehaviorAttribute, działają w całej usłudze. Na przykład, jeśli ustawisz właściwość ServiceBehaviorAttribute.ConcurrencyMode na ConcurrencyMode.Multiple, musisz samodzielnie obsłużyć 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. Funkcje kontraktu działają na poziomie kontraktu, a funkcje operacji modyfikują realizację operacji.

Wiele z tych zachowań jest implementowanych na atrybutach i używasz ich tak jak atrybutów ServiceBehaviorAttribute 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 serwisowe

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 transportów, 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 systemu

Następujące specyfikacje operacji określają serializację i kontrolę transakcji w operacjach.

Zobacz także