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

Depois de criar um contrato de serviço (Projetando contratos de serviço) e implementar seu contrato de serviço (Implementando contratos de serviço), você pode configurar o comportamento de operação do tempo de execução do serviço. Este tópico discute os comportamentos de serviço e operação fornecidos pelo sistema e descreve onde encontrar mais informações para criar novos comportamentos. Enquanto alguns comportamentos são aplicados como atributos, muitos são aplicados usando um arquivo de configuração do aplicativo ou programaticamente. Para obter mais informações sobre como configurar seu aplicativo de serviço, consulte Configurando serviços.

Descrição geral

O contrato define as entradas, saídas, tipos de dados e capacidades de um serviço desse tipo. A implementação de um contrato de serviço cria uma classe que, quando configurada com uma vinculação em um endereço, cumpre o contrato que implementa. Informações contratuais, vinculativas e de endereço são todas conhecidas pelo cliente; Sem eles, o cliente não pode fazer uso do serviço.

No entanto, as especificidades da operação, como problemas de threading ou gerenciamento de instâncias, 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 tempo de execução do Windows Communication Foundation (WCF) definindo uma propriedade de tempo de execução ou inserindo um tipo de personalização no tempo de execução. Para obter mais informações sobre como modificar o tempo de execução criando comportamentos definidos pelo usuário, consulte Estendendo ServiceHost e a camada de modelo de serviço.

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

Este tópico fornece uma visão geral dos atributos e OperationBehaviorAttribute , descreve os vários escopos nos quais os ServiceBehaviorAttribute 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 do WCF.

ServiceBehaviorAttribute e OperationBehaviorAttribute

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

  • Tempo de vida da instância

  • Suporte a simultaneidade e sincronização

  • Comportamento de configuração

  • Comportamento da transação

  • Comportamento de serialização

  • Transformação de metadados

  • Duração da sessão

  • Filtragem de endereços e processamento de cabeçalhos

  • Falsificação de identidade

  • Para usar esses atributos, marque a implementação do 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 OperationBehaviorAttribute.Impersonation propriedade 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 requerem suporte adicional da ligação. Por exemplo, uma operação que requer uma transação do cliente deve ser configurada para usar uma associação que ofereça suporte a transações fluídas.

Serviços Singleton bem conhecidos

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

Por exemplo, a propriedade controla ServiceBehaviorAttribute.InstanceContextMode a frequência com que o é liberado InstanceContext e o OperationBehaviorAttribute.ReleaseInstanceMode controle e ServiceBehaviorAttribute.ReleaseServiceInstanceOnTransactionComplete properties 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 ServiceBehaviorAttribute.InstanceContextMode propriedade como Single ou uma exceção é lançada quando o host de serviço é aberto.

Use o ServiceHost(Object, Uri[]) construtor para criar tal serviço. Ele fornece uma alternativa à implementação de um personalizado System.ServiceModel.Dispatcher.IInstanceContextInitializer quando você deseja fornecer 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 é 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 Windows Communication Foundation (WCF) funcionam de forma diferente. Por exemplo, a chamada InstanceContext.ReleaseServiceInstance não tem efeito quando uma instância de objeto conhecida é fornecida. Da mesma forma, qualquer outro mecanismo de liberação de instância é ignorado. A ServiceHost classe sempre se comporta como se a OperationBehaviorAttribute.ReleaseInstanceMode propriedade estivesse definida para ReleaseInstanceMode.None todas as operações.

Outros comportamentos de serviço, endpoint, contrato e operação

Os comportamentos de serviço, como o ServiceBehaviorAttribute atributo, operam em todo um serviço. Por exemplo, se você definir a ServiceBehaviorAttribute.ConcurrencyMode propriedade para ConcurrencyMode.Multiple você mesmo deve lidar com problemas de sincronização de thread dentro de cada operação nesse serviço. Os 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 contratuais 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 você os usa como faz com os ServiceBehaviorAttribute atributos e OperationBehaviorAttribute — aplicando-os à classe de serviço ou implementação de operação apropriada. Outros comportamentos, como os ServiceMetadataBehavior objetos or ServiceDebugBehavior , normalmente são aplicados usando um arquivo de configuração do aplicativo, embora também possam ser usados programaticamente.

Por exemplo, a publicação de metadados é configurada usando o ServiceMetadataBehavior objeto. O seguinte arquivo de configuração do aplicativo 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 em tempo de execução do seu serviço ou cliente. Consulte o tópico de referência para determinar como usar cada um deles.

Comportamentos de serviço

Os comportamentos a seguir operam em serviços.

Comportamentos de ponto final

Os comportamentos a seguir operam em 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 MustUnderstand processamento.

  • SynchronousReceiveBehavior. Instrui o tempo de execução a usar um processo de recebimento síncrono para canais.

  • TransactedBatchingBehavior. Otimiza as operações de recebimento para transportes que suportam recebimentos transacionais.

Comportamentos contratuais

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

Comportamentos de Operação

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

Consulte também