Поделиться через


Настройка и расширение среды выполнения с помощью поведения

Поведение позволяет изменять поведение по умолчанию и добавлять пользовательские расширения, которые проверяют и подтверждают конфигурацию служб или изменяют поведение времени выполнения в клиентских и служебных приложениях Windows Communication Foundation (WCF). В этом разделе описываются интерфейсы поведения, способы их реализации и их добавление в описание службы (в приложении службы) или конечной точке (в клиентском приложении) программным способом или в файле конфигурации. Дополнительные сведения об использовании системного поведения см. в разделе "Задание поведения службы Run-Time" и Задание поведения клиента Run-Time.

Поведение

Типы поведения добавляются в объекты описания конечной точки службы или службы (в службе или клиенте соответственно), прежде чем эти объекты используются Windows Communication Foundation (WCF) для создания среды выполнения, которая выполняет службу WCF или клиент WCF. При вызове этих действий во время процесса построения среды выполнения они смогут получить доступ к свойствам и методам среды выполнения, которые изменяют среду выполнения, созданную контрактом, привязками и адресами.

Методы поведения

Все поведения имеют метод AddBindingParameters, метод ApplyDispatchBehavior, метод Validate, и метод ApplyClientBehavior с одним исключением: поскольку IServiceBehavior невозможно выполнить в клиенте, он не реализует ApplyClientBehavior.

  • Используйте метод AddBindingParameters, чтобы изменить или добавить пользовательские объекты в коллекцию, к которым пользовательские привязки могут получить доступ, чтобы использовать их при создании среды выполнения. Например, это то, как указаны требования к защите, влияющие на способ построения канала, но не известны разработчику канала.

  • Validate Используйте метод для проверки дерева описания и соответствующего объекта среды выполнения, чтобы убедиться, что он соответствует определенному набору критериев.

  • Используйте методы ApplyDispatchBehavior и ApplyClientBehavior для изучения дерева описания и модификации среды выполнения для определенной области в службе или клиенте. Кроме того, можно вставить объекты расширения.

    Замечание

    Хотя дерево описания предоставляется в этих методах, оно предназначено только для проверки. Если дерево описания изменено, поведение не определено.

Свойства, которые можно изменить, и интерфейсы настройки, которые можно реализовать, доступны через классы службы и среды выполнения клиента. Типы служб — это DispatchRuntime классы и DispatchOperation классы. Типы клиентов — это ClientRuntime классы и ClientOperation классы. Классы ClientRuntime и DispatchRuntime являются точками входа расширяемости для доступа к свойствам среды выполнения на уровне клиента и коллекциям расширений на уровне служб соответственно. Аналогичным образом, классы ClientOperation и DispatchOperation экспонируют свойства среды выполнения операций клиентов и операций сервисов, а также коллекции расширений соответственно. Однако вы можете получить доступ к более широкому объекту среды выполнения операции из объекта среды выполнения операции и наоборот, если это необходимо.

Замечание

Обсуждение свойств среды выполнения и типов расширений, которые можно использовать для изменения поведения выполнения клиента, см. в разделе "Расширение клиентов". Обсуждение свойств среды выполнения и типов расширений, которые можно использовать для изменения поведения выполнения диспетчера служб, см. в разделе "Расширение диспетчеров".

Большинство пользователей WCF не взаимодействуют с средой выполнения напрямую; Вместо этого они используют основные конструкции модели программирования, такие как конечные точки, контракты, привязки, адреса и атрибуты поведения для классов или поведения в файлах конфигурации. Эти конструкции составляют дерево описания, которое является полной спецификацией для создания среды выполнения для поддержки службы или клиента, описанного деревом описания.

Существует четыре типа поведения в WCF:

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

  • Поведение конечных точек (IEndpointBehavior типы) позволяет настраивать конечные точки службы и связанные EndpointDispatcher с ними объекты.

  • Поведения контрактов (типы IContractBehavior) позволяют настраивать классы ClientRuntime для клиентских приложений и классы DispatchRuntime для служебных приложений соответственно.

  • Поведение операций (IOperationBehavior типы) позволяет настраивать ClientOperation и DispatchOperation классы, опять же, на клиенте и службе.

Эти действия можно добавить в различные объекты описания, реализуя пользовательские атрибуты, используя файлы конфигурации приложения или напрямую добавляя их в коллекцию поведения для соответствующего объекта описания. Необходимо, однако, добавить обязательное условие в описание службы или объект описания конечной точки службы перед вызовом ICommunicationObject.Open на ServiceHost или ChannelFactory<TChannel>.

Области поведения

Существует четыре типа поведения, каждый из которых соответствует определенной области доступа во время выполнения.

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

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

  1. Использование атрибута в сервисном классе. ServiceHost При построении ServiceHost реализация использует отражение для обнаружения набора атрибутов типа службы. Если какие-либо из этих атрибутов являются реализациями IServiceBehavior, они добавляются в коллекцию поведения на ServiceDescription. Это позволяет таким образом, этим поведенческим аспектам участвовать в формировании среды выполнения службы.

  2. Программное добавление поведения в коллекцию поведений на ServiceDescription. Это можно сделать со следующими строками кода:

    ServiceHost host = new ServiceHost(/* Parameters */);
    host.Description.Behaviors.Add(/* Service Behavior */);
    
  3. Реализация настраиваемого BehaviorExtensionElement, расширяющего конфигурацию. Это позволяет использовать поведение службы из файлов конфигурации приложения.

Примеры поведения служб в WCF включают ServiceBehaviorAttribute атрибут, ServiceThrottlingBehavior поведение и ServiceMetadataBehavior поведение.

Особенности контракта

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

Существует два механизма добавления поведения в контракт. Первый механизм — создать пользовательский атрибут, который будет использоваться в интерфейсе контракта. При передаче интерфейса контракта либо в ServiceHost, либо в ChannelFactory<TChannel>, WCF проверяет атрибуты на интерфейсе. Если какие-либо атрибуты являются реализациями IContractBehavior, они добавляются в коллекцию поведений на System.ServiceModel.Description.ContractDescription, созданную для этого интерфейса.

Вы также можете реализовать атрибут пользовательского поведения контракта System.ServiceModel.Description.IContractBehaviorAttribute. В этом случае поведение выглядит следующим образом при применении к:

• Интерфейс контракта. В этом случае поведение применяется ко всем контрактам этого типа в любой конечной точке и WCF игнорирует значение IContractBehaviorAttribute.TargetContract свойства.

• Класс сервиса. В этом случае поведение применяется только к конечным точкам, контракт которых соотносится со значением свойства TargetContract.

• Класс обратного вызова. В этом случае поведение применяется к конечной точке дуплексного клиента, и WCF игнорирует значение TargetContract свойства.

Второй механизм заключается в добавлении поведения в коллекцию поведенческих свойств на объекте ContractDescription.

Примеры поведения контрактов в WCF включают атрибут System.ServiceModel.DeliveryRequirementsAttribute. Дополнительные сведения и пример см. в справочном разделе.

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

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

Существует два механизма добавления поведения конечных точек в службу.

  1. Добавьте поведение к Behaviors свойству.

  2. Реализуйте настраиваемый BehaviorExtensionElement, расширяющий конфигурацию.

Дополнительные сведения и пример см. в справочном разделе.

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

Поведения операций, реализующие интерфейс IOperationBehavior, используются для расширения среды выполнения как клиента, так и службы для каждой операции.

Существует два механизма добавления поведения операций в операцию. Первый механизм заключается в создании пользовательского атрибута для использования в методе, который моделирует операцию. При добавлении операции в ServiceHost или ChannelFactory WCF добавляет любые атрибуты IOperationBehavior в коллекцию поведения на OperationDescription, созданную для этой операции.

Второй механизм заключается в непосредственном добавлении поведения в коллекцию поведения в созданном OperationDescriptionобъекте.

Примеры поведения операций в WCF включают OperationBehaviorAttribute и TransactionFlowAttribute.

Дополнительные сведения и пример см. в справочном разделе.

Использование конфигурации для создания поведения

Поведение служб и конечной точки и контракта может быть определено в коде или с помощью атрибутов; Можно настроить только поведение служб и конечных точек с помощью файлов конфигурации приложения или веб-конфигурации. Отображение поведения с помощью атрибутов позволяет разработчикам указывать поведение во время компиляции, которое невозможно добавить, удалить или изменить во время выполнения. Это часто подходит для поведения, которые всегда требуются для правильной работы службы (например, параметров, связанных с транзакциями для атрибута System.ServiceModel.ServiceBehaviorAttribute ). Отображение поведения с помощью конфигурации позволяет разработчикам оставлять спецификацию и конфигурацию этих действий тем, кто развертывает службу. Это подходит для поведений, которые являются необязательным компонентом или другой конфигурацией развертывания, например, открыты ли метаданные для службы или конкретной конфигурации авторизации службы.

Замечание

Вы также можете использовать поведение, которое поддерживает конфигурацию для применения политик приложений компании, вставляя их в файл конфигурации machine.config и блокируя эти элементы. Описание и пример см. в статье "Практическое руководство. Блокировка конечных точек в организации".

Чтобы предоставить поведение с помощью конфигурации, разработчик должен создать производный класс BehaviorExtensionElement и зарегистрировать это расширение в конфигурации.

В следующем примере кода показано, как IEndpointBehavior реализует BehaviorExtensionElement.

// BehaviorExtensionElement members
public override Type BehaviorType
{
  get { return typeof(EndpointBehaviorMessageInspector); }
}

protected override object CreateBehavior()
{
  return new EndpointBehaviorMessageInspector();
}

Чтобы система конфигурации загружала пользовательскую BehaviorExtensionElement, её нужно зарегистрировать как расширение. В следующем примере кода показан файл конфигурации для предыдущего поведения конечной точки:

<configuration>
  <system.serviceModel>
    <services>
      <service
        name="Microsoft.WCF.Documentation.SampleService"
        behaviorConfiguration="metadataSupport"
      >
        <host>
          <baseAddresses>
            <add baseAddress="http://localhost:8080/ServiceMetadata" />
          </baseAddresses>
        </host>
        <endpoint
          address="/SampleService"
          binding="wsHttpBinding"
          behaviorConfiguration="withMessageInspector"
          contract="Microsoft.WCF.Documentation.ISampleService"
        />
        <endpoint
           address="mex"
           binding="mexHttpBinding"
           contract="IMetadataExchange"
        />
      </service>
    </services>
    <behaviors>
      <serviceBehaviors>
      <behavior name="metadataSupport">
        <serviceMetadata httpGetEnabled="true" httpGetUrl=""/>
      </behavior>
      </serviceBehaviors>
      <endpointBehaviors>
        <behavior name="withMessageInspector">
          <endpointMessageInspector />
        </behavior>
      </endpointBehaviors>
    </behaviors>
    <extensions>
      <behaviorExtensions>
        <add
          name="endpointMessageInspector"
          type="Microsoft.WCF.Documentation.EndpointBehaviorMessageInspector, HostApplication, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null"
        />
      </behaviorExtensions>
    </extensions>
  </system.serviceModel>
</configuration>

Где Microsoft.WCF.Documentation.EndpointBehaviorMessageInspector используется тип расширения поведения и HostApplication имя сборки, в которую был скомпилирован этот класс.

Порядок оценки

System.ServiceModel.ChannelFactory<TChannel> и System.ServiceModel.ServiceHost отвечают за создание среды выполнения на основе модели программирования и описания. Поведения, как описано ранее, влияют на процесс сборки на уровне службы, конечной точки, контракта и операции.

ServiceHost применяется в следующем порядке:

  1. Услуга

  2. Контракт

  3. Конечная точка

  4. Операция

В любом наборе поведений порядок не гарантируется.

ChannelFactory<TChannel> применяется в следующем порядке:

  1. Контракт

  2. Конечная точка

  3. Операция

В любой коллекции поведения, опять же, порядок не гарантируется.

Программное добавление поведения

Свойства System.ServiceModel.Description.ServiceDescription в приложении-службе не должны быть изменены после вызова метода CommunicationObject.OnOpening на System.ServiceModel.ServiceHostBase. Некоторые члены, такие как свойство ServiceHostBase.Credentials и методы AddServiceEndpoint на ServiceHostBase и System.ServiceModel.ServiceHost, вызывают исключение, если их изменить после этой точки. Другие позволяют изменять их, но результат не определен.

На клиенте аналогичным образом, значения System.ServiceModel.Description.ServiceEndpoint не должны быть изменены после вызова OnOpening в System.ServiceModel.ChannelFactory. Свойство ChannelFactory.Credentials создает исключение, если его изменение происходит после этого момента, но другие значения описания клиента могут быть изменены без ошибок. Однако результат не определен.

Рекомендуется изменить описание для службы или для клиента перед вызовом CommunicationObject.Open.

Правила наследования атрибутов поведения

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

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

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

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

[ServiceBehavior(ConcurrencyMode = ConcurrencyMode.Multiple)]
[AspNetCompatibilityRequirementsAttribute(
    AspNetCompatibilityRequirementsMode = AspNetCompatibilityRequirementsMode.Allowed)]
public class A { /* … */ }

[ServiceBehavior(InstanceContextMode = InstanceContextMode.Single)]
public class B : A { /* … */}

Например, в предыдущем случае служба B оказывается с InstanceContextModeSingle, режимом AspNetCompatibilityRequirementsModeAllowed и ConcurrencyModeSingle. ConcurrencyModeЭто Single связано с тем, что ServiceBehaviorAttribute атрибут в службе B находится на "более производном", чем в службе A.

Особенности контракта

Для данного контракта применяются все атрибуты поведения контракта в этом интерфейсе и на родителях этого интерфейса. Если один и тот же тип атрибута применяется в нескольких местах в иерархии наследования, используется наиболее производный тип.

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

Если данная операция не переопределяет существующую абстрактную или виртуальную операцию, правила наследования не применяются.

Если операция переопределяет существующую, применяются все атрибуты поведения как этой операции, так и её родительских элементов. Если один и тот же тип атрибута применяется в нескольких местах в иерархии наследования, используется наиболее производный тип.