Especificando comportamento de tempo de execução de serviço

Depois de criar um contrato de serviço (Criação de contratos de serviço) e implementar seu contrato de serviço (implementação de contratos de serviço), você poderá configurar o comportamento de operação do runtime de serviço. Este tópico discute comportamentos de serviço e operação fornecidos pelo sistema e descreve onde encontrar mais informações para criar novos comportamentos. Embora alguns comportamentos sejam aplicados como atributos, muitos são aplicados usando um arquivo de configuração de aplicativo ou programaticamente. Para saber mais sobre como configurar seu aplicativo de serviço, confira Configuração de serviços.

Visão geral

O contrato define as entradas, saídas, tipos de dados e funcionalidades de um serviço desse tipo. A implementação de um contrato de serviço cria uma classe que, quando configurada com uma associação em um endereço, atende ao contrato que implementa. As informações contratuais, de associação e de endereço são todas conhecidas pelo cliente; sem elas, o cliente não pode usar o serviço.

No entanto, as especificidades da operação, como problemas de threading ou gerenciamento de instância, são opacas para os clientes. Depois de implementar seu contrato de serviço, você pode configurar um grande número de características de operação usando comportamentos. Comportamentos são objetos que modificam o runtime do WCF (Windows Communication Foundation) definindo uma propriedade de runtime ou inserindo um tipo de personalização no runtime. Para saber mais sobre como modificar o runtime criando comportamentos definidos pelo usuário, confira Extensão do ServiceHost e da Camada de Modelo de Serviço.

Os atributos System.ServiceModel.ServiceBehaviorAttribute e System.ServiceModel.OperationBehaviorAttribute são os comportamentos mais úteis e expõem os recursos de operação mais comumente solicitados. Como eles são atributos, você os aplica à implementação de serviço ou de operação. Outros comportamentos, como System.ServiceModel.Description.ServiceMetadataBehavior ou System.ServiceModel.Description.ServiceDebugBehavior, normalmente são aplicados usando um arquivo de configuração de aplicativo, embora você possa usá-los programaticamente.

Este tópico fornece uma visão geral dos atributos ServiceBehaviorAttribute e OperationBehaviorAttribute, descreve os vários escopos nos quais os comportamentos podem operar e fornece uma descrição rápida de muitos dos comportamentos fornecidos pelo sistema nos vários escopos que podem ser de interesse para os desenvolvedores de WCF.

ServiceBehaviorAttribute e OperationBehaviorAttribute

Os comportamentos mais importantes são os atributos ServiceBehaviorAttribute e OperationBehaviorAttribute, que você pode usar para controlar:

  • Tempos de vida de instâncias

  • Suporte a simultaneidade e sincronização

  • Comportamento da configuração

  • Comportamento da transação

  • Comportamento de serialização

  • Transformação de metadados

  • Tempo de vida da sessão

  • Filtragem de endereço e processamento de cabeçalho

  • Representação

  • Para usar esses atributos, marque a implementação de serviço ou operação com o atributo apropriado para esse escopo e defina as propriedades. Por exemplo, o exemplo de código a seguir mostra uma implementação de operação que usa a propriedade OperationBehaviorAttribute.Impersonation para exigir que os chamadores dessa operação ofereçam suporte à representação.

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

Muitas das propriedades exigem suporte adicional da associação. Por exemplo, uma operação que requer uma transação do cliente deve ser configurada para usar uma associação que dê suporte a transações fluídas.

Serviços singleton conhecidos

Você pode usar os atributos ServiceBehaviorAttribute e OperationBehaviorAttribute para controlar determinados tempos de vida, tanto do InstanceContext quanto dos objetos de serviço que implementam as operações.

Por exemplo, a propriedade ServiceBehaviorAttribute.InstanceContextMode controla com que frequência o InstanceContext é liberado, as propriedades OperationBehaviorAttribute.ReleaseInstanceMode e ServiceBehaviorAttribute.ReleaseServiceInstanceOnTransactionComplete controlam quando o objeto de serviço é liberado.

No entanto, você também pode criar um objeto de serviço por conta própria e criar o host de serviço usando esse objeto. Para fazer isso, você também deve definir a propriedade ServiceBehaviorAttribute.InstanceContextMode como Single ou uma exceção será gerada quando o host de serviço for aberto.

Use o construtor ServiceHost(Object, Uri[]) para criar esse serviço. Ele fornece uma alternativa para implementar um System.ServiceModel.Dispatcher.IInstanceContextInitializer personalizado quando você deseja quer uma instância de objeto específica para uso por um serviço singleton. Você pode usar essa sobrecarga quando o tipo de implementação de serviço for difícil de construir (por exemplo, se ele não implementar um construtor público sem parâmetros).

Observe que quando um objeto é fornecido a esse construtor, alguns recursos relacionados ao comportamento de instanciação do WCF (Windows Communication Foundation) funcionam de forma diferente. Por exemplo, chamar InstanceContext.ReleaseServiceInstance não tem efeito quando uma instância de objeto bem conhecida é fornecida. Da mesma forma, qualquer outro mecanismo de liberação de instância é ignorado. A classe ServiceHost sempre se comporta como se a propriedade OperationBehaviorAttribute.ReleaseInstanceMode estivesse definida como ReleaseInstanceMode.None para todas as operações.

Outros comportamentos de serviço, ponto de extremidade, contrato e operação

Comportamentos de serviço, como o atributo ServiceBehaviorAttribute, operam em um serviço inteiro. Por exemplo, se você definir a propriedade ServiceBehaviorAttribute.ConcurrencyMode como ConcurrencyMode.Multiple, deverá lidar com problemas de sincronização de thread dentro de cada operação nesse serviço por conta própria. Comportamentos de ponto de extremidade operam em um ponto de extremidade; muitos dos comportamentos de ponto de extremidade fornecidos pelo sistema são para a funcionalidade do cliente. Os comportamentos do contrato operam no nível do contrato, e os comportamentos de operação modificam a entrega da operação.

Muitos desses comportamentos são implementados em atributos e fazem uso deles assim como você faz com os atributos ServiceBehaviorAttribute e OperationBehaviorAttribute, aplicando-os à classe de serviço ou à implementação de operação apropriada. Outros comportamentos, como objetos ServiceMetadataBehavior ou ServiceDebugBehavior, normalmente são aplicados usando um arquivo de configuração de aplicativo, embora você possa usá-los programaticamente.

Por exemplo, a publicação de metadados é configurada usando o objeto ServiceMetadataBehavior. O arquivo de configuração de aplicativo a seguir mostra o uso mais comum.

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

As seções a seguir descrevem muitos dos comportamentos mais úteis fornecidos pelo sistema que você pode usar para modificar a entrega de runtime do seu serviço ou cliente. Confira o tópico de referência para determinar como usar cada um deles.

Comportamentos de Serviço

Os comportamentos a seguir operam nos serviços.

Comportamentos de Ponto de Extremidade

Os comportamentos a seguir operam nos pontos de extremidade. Muitos desses comportamentos são usados em aplicativos cliente.

  • CallbackBehaviorAttribute. Configura uma implementação de serviço de retorno de chamada em um aplicativo cliente duplex.

  • CallbackDebugBehavior. Habilita a depuração de serviço para um objeto de retorno de chamada WCF.

  • ClientCredentials. Permite que o usuário configure as credenciais do cliente e do serviço, bem como as configurações de autenticação de credenciais de serviço para uso no cliente.

  • ClientViaBehavior. Usado pelos clientes para especificar o URI (Uniform Resource Identifier) para o qual o canal de transporte deve ser criado.

  • MustUnderstandBehavior. Instrui o WCF a desabilitar o processamento MustUnderstand.

  • SynchronousReceiveBehavior. Instrui o runtime a usar um processo de recebimento síncrono para canais.

  • TransactedBatchingBehavior. Otimiza as operações de recebimento para os transportes que dão suporte aos recebimentos transacionais.

Comportamentos do contrato

DeliveryRequirementsAttribute. Especifica os requisitos de recurso que as associações devem fornecer para a implementação do serviço ou cliente.

Comportamentos da operação

Os comportamentos de operação a seguir especificam controles de serialização e transação para operações.

Confira também