Указание поведения службы во время выполнения

После создания (Designing Service Contracts) и реализации (Implementing Service Contracts) контракта службы можно переходить к настройке рабочего поведения для среды выполнения службы. В этом разделе рассматриваются предоставляемые системой поведения служб и операций, а также указывается, где можно найти дополнительные сведения по созданию новых поведений. Хотя некоторые поведения применяются как атрибуты, многие поведения применяются с помощью файла конфигурации приложения или программно. Дополнительные сведения о настройке приложения-службы см. в разделе "Настройка служб".

Обзор

Контракт определяет входные данные, выходные данные, типы данных и возможности службы этого типа. При реализации контракта службы создается класс, которой, при настройке с привязкой к адресу, выполняет реализуемый им контракт. Сведения о контракте, привязке и адресе известны клиенту; без этих сведений клиент не может пользоваться службой.

Однако конкретные сведения об операциях, такие как сведения о потоках или управлении экземплярами, не видны клиентам. После реализации контракта службы можно настроить большое количество характеристик операций с помощью поведений. Поведение — это объекты, изменяющие среду выполнения Windows Communication Foundation (WCF), задав свойство среды выполнения или вставив тип настройки в среду выполнения. Дополнительные сведения об изменении среды выполнения путем создания определяемых пользователем действий см. в разделе "Расширение ServiceHost" и уровня модели службы.

Атрибуты System.ServiceModel.ServiceBehaviorAttribute и System.ServiceModel.OperationBehaviorAttribute являются наиболее широко используемыми поведениями, раскрывающими наиболее часто запрашиваемые функции операции. Так как они являются атрибутами, они применяются к реализации службы или операции. Другие поведения, такие как System.ServiceModel.Description.ServiceMetadataBehavior и System.ServiceModel.Description.ServiceDebugBehavior, обычно применяются с помощью файла конфигурации приложения, хотя их можно использовать и программно.

В этом разделе представлен обзор ServiceBehaviorAttribute и OperationBehaviorAttribute атрибуты, описываются различные область, при которых поведение может работать, и предоставляет краткое описание многих системных действий на различных область, которые могут быть заинтересованы в разработчиках WCF.

Атрибуты ServiceBehaviorAttribute и OperationBehaviorAttribute

Наиболее важными поведениями являются атрибуты ServiceBehaviorAttribute и OperationBehaviorAttribute , которые можно использовать для управления указанными ниже характеристиками.

  • Время существования экземпляра

  • Поддержка параллелизма и синхронизации

  • Поведение конфигурации

  • Поведение транзакции

  • Поведение сериализации

  • Преобразование метаданных

  • Время существования сеанса

  • Фильтрация адресов и обработка заголовков

  • Олицетворение

  • Для использования этих атрибутов пометьте реализацию службы или операции атрибутом, подходящим для определенной области и набора свойств. Например, в следующем примере кода показана реализация операции, в которой с помощью свойства OperationBehaviorAttribute.Impersonation задается требование, чтобы вызывающая сторона этой операции поддерживала олицетворение.

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

Многие свойства требуют дополнительной поддержки со стороны привязки. Например, операция, которой требуется транзакция от клиента, должна быть настроена для использования привязки, поддерживающей поток транзакций.

Широко известные одноэлементные службы

Атрибуты ServiceBehaviorAttribute и OperationBehaviorAttribute можно использовать для управления определенными временами существования, как InstanceContext , так и объектов службы, реализующих операции.

Например, свойство ServiceBehaviorAttribute.InstanceContextMode управляет частотой высвобождения InstanceContext , а свойства OperationBehaviorAttribute.ReleaseInstanceMode и ServiceBehaviorAttribute.ReleaseServiceInstanceOnTransactionComplete управляют моментом высвобождения объекта службы.

Однако можно также самому создать объект службы, а затем создать основное приложение службы, используя этот объект. Для этого необходимо задать для свойства ServiceBehaviorAttribute.InstanceContextMode значение Single - в противном случае при открытии основного приложения службы возникает исключение.

Для создания такой службы используйте конструктор ServiceHost(Object, Uri[]) . Он обеспечивает альтернативу реализации пользовательского System.ServiceModel.Dispatcher.IInstanceContextInitializer , если требуется предоставить определенный экземпляр объекта для использования одноэлементной службой. Эту перегрузку можно использовать, если тип реализации службы сложно создать (например, если он не реализует общедоступный конструктор без параметров).

Обратите внимание, что при предоставлении объекта этому конструктору некоторые функции, связанные с поведением windows Communication Foundation (WCF), работают по-другому. Например, вызов InstanceContext.ReleaseServiceInstance не выполняет никаких действий, если предоставлен экземпляр хорошо известного объекта. Аналогичным образом игнорируются все другие механизмы освобождения экземпляров. Класс ServiceHost всегда ведет себя таким образом, как если бы для свойства OperationBehaviorAttribute.ReleaseInstanceMode было задано значение ReleaseInstanceMode.None для всех операций.

Другие поведения службы, конечной точки, контракта и операции

Поведения службы, такие как атрибут ServiceBehaviorAttribute , действуют во всей службе. Например, если для свойства ServiceBehaviorAttribute.ConcurrencyMode задано значение ConcurrencyMode.Multiple , необходимо самостоятельно обрабатывать вопросы синхронизации потоков внутри каждой операции службы. Поведения конечной точки действуют на уровне конечной точки; многие из предоставляемых системой поведений конечных точек предназначены для функциональных возможностей клиентов. Поведения контракта действуют на уровне контракта, а поведения операции изменяют доставку операции.

Многие из этих поведений реализованы атрибутами, и их можно использовать так же, как и атрибуты ServiceBehaviorAttribute и OperationBehaviorAttribute - применяя их к определенной реализации класса службы или операции. Другие поведения, такие как объекты ServiceMetadataBehavior и ServiceDebugBehavior , обычно применяются с помощью файла конфигурации приложения, хотя их можно также использовать программно.

Например, публикация метаданных настраивается с помощью объекта ServiceMetadataBehavior . В следующем файле конфигурации приложения показано наиболее часто встречающееся применение.

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

В следующих разделах рассматриваются многие из наиболее полезных предоставляемых системой поведений, которые можно использовать для изменения доставки среды выполнения службы или клиента. Порядок использования каждого из них см. в разделе, указанном в ссылке.

Поведения служб

Следующие поведения работают на уровне служб.

  • AspNetCompatibilityRequirementsAttribute. Применяется к службе WCF, чтобы указать, может ли эта служба выполняться в режиме совместимости ASP.NET.

  • ServiceAuthorizationBehavior. Управляет тем, как служба авторизует запросы клиентов.

  • ServiceCredentials. Настраивает учетные данные службы. Этот класс используется для указания учетных данных для службы, таких как сертификат X.509.

  • ServiceDebugBehavior. Включает функции отладки и справки для службы WCF.

  • ServiceMetadataBehavior. Контролирует публикацию метаданных службы и связанной с ними информации.

  • ServiceSecurityAuditBehavior. Задает расширения функциональности аудита для событий безопасности.

  • ServiceThrottlingBehavior. Настраивает параметры производительности времени выполнения, которые позволяют настроить производительность службы.

Поведения конечных точек

Следующие поведения работают на уровне конечных точек. Многие из этих поведений используются в клиентских приложениях.

  • CallbackBehaviorAttribute. Настраивает реализацию службы обратного вызова в дуплексном клиентском приложении.

  • CallbackDebugBehavior. Включает отладку службы для объекта обратного вызова WCF.

  • ClientCredentials. Позволяет пользователю настроить учетные данные клиента и службы, а также параметры проверки подлинности учетных данных службы для использования в клиенте.

  • ClientViaBehavior. Используется клиентами, чтобы указать универсальный код ресурса (URI), для которого необходимо создать канал транспорта.

  • MustUnderstandBehavior. Указывает WCF отключить обработку MustUnderstand .

  • SynchronousReceiveBehavior. Указывает, что в среде выполнения для каналов должен использоваться синхронный процесс получения.

  • TransactedBatchingBehavior. Оптимизирует операции получения для транспорта, поддерживающего транзакционные получения.

Поведения контрактов

DeliveryRequirementsAttribute. Задает требования к функциям, которые должны поддерживаться привязками для реализации службы или клиента.

Поведения операций

Указанные ниже поведения операций задают элементы управления сериализацией и транзакциями для операций.

См. также