Especificación del comportamiento en tiempo de ejecución del servicio

Una vez que haya diseñado un contrato de servicios (Designing Service Contracts) y haya implementado su contrato de servicios (Implementing Service Contracts), puede configurar el comportamiento de la operación del tiempo de ejecución del servicio. En este tema se tratan los comportamientos de operaciones y servicios proporcionados por el sistema y se describe dónde encontrar más información para crear nuevos comportamientos. Aunque algunos comportamientos se aplican como atributos, muchos se aplican usando un archivo de configuración de la aplicación o mediante programación. Para obtener más información sobre cómo configurar la aplicación de servicio, consulte Configuración de servicios WCF.

Información general

El contrato define las entradas, las salidas, los tipos de datos y las características de un servicio de ese tipo. Al implementar un contrato de servicios, se crea una clase que, cuando se configura con un enlace en una dirección, cumple el contrato que implementa. El cliente conoce la información contractual, de enlace y dirección; sin esa información, el cliente no puede utilizar el servicio.

Sin embargo, las características de la operación, como los problemas de los subprocesos o la administración de instancias, son opacas para los clientes. Cuando haya implementado su contrato de servicios, puede configurar un gran número de características de operaciones utilizando los comportamientos. Los comportamientos son objetos que modifican el entorno de ejecución de Windows Communication Foundation (WCF) estableciendo una propiedad en tiempo de ejecución o insertando un tipo de personalización en el entorno de ejecución. Para obtener más información sobre cómo modificar el entorno de ejecución creando comportamientos definidos por el usuario, consulte Extensión de ServiceHost y la capa de modelos de servicios.

Los atributos System.ServiceModel.ServiceBehaviorAttribute y System.ServiceModel.OperationBehaviorAttribute son los comportamientos más útiles y exponen las funciones de operaciones más solicitadas. Puesto que son atributos, se han de aplicar a la implementación de la operación o el servicio. Otros comportamientos, como System.ServiceModel.Description.ServiceMetadataBehavior o System.ServiceModel.Description.ServiceDebugBehavior, se aplican, normalmente, mediante un archivo de configuración de la aplicación, aunque puede utilizarlos mediante programación.

Este tema ofrece información general sobre los atributos ServiceBehaviorAttribute y OperationBehaviorAttribute, describe los diversos ámbitos en los que pueden funcionar los comportamientos y proporciona una descripción rápida de muchos de los comportamientos proporcionados por el sistema en los diversos ámbitos que pueden ser de interés para los desarrolladores de WCF.

ServiceBehaviorAttribute y OperationBehaviorAttribute

Los comportamientos más importantes son los atributos ServiceBehaviorAttribute y OperationBehaviorAttribute , que puede utilizar para controlar:

  • La duración de las instancias

  • La compatibilidad con respecto a la simultaneidad y la sincronización

  • Comportamiento de configuración

  • Comportamiento de transacción

  • Comportamiento de serialización

  • Transformación de metadatos

  • Duración de sesión

  • Filtrado de direcciones y procesamiento de encabezados

  • Suplantación

  • Para utilizar estos atributos, marque el servicio o implementación de la operación con el atributo adecuado a ese ámbito y establezca las propiedades. Por ejemplo, el siguiente ejemplo de código muestra una implementación de la operación que utiliza la propiedad OperationBehaviorAttribute.Impersonation para requerir que los llamadores de esta operación admitan la suplantación.

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

Muchas de las propiedades requieren una compatibilidad adicional del enlace. Por ejemplo, una operación que requiere una transacción del cliente se debe configurar para que utilice un enlace que admita transacciones de flujo.

Servicios conocidos singleton

Puede utilizar los atributos ServiceBehaviorAttribute y OperationBehaviorAttribute para controlar ciertas duraciones, de InstanceContext y de los objetos de servicio que implementan las operaciones.

Por ejemplo, la propiedad ServiceBehaviorAttribute.InstanceContextMode controla con qué frecuencia se libera el InstanceContext , y las propiedades OperationBehaviorAttribute.ReleaseInstanceMode y ServiceBehaviorAttribute.ReleaseServiceInstanceOnTransactionComplete controlan cuando se libera el objeto de servicios.

Sin embargo, también puede crear un objeto de servicio y crear el host de servicio mediante ese objeto. Para hacerlo, debe establecer también la propiedad ServiceBehaviorAttribute.InstanceContextMode en Single o se producirá una excepción al abrir el host del servicio.

Utilice el constructor ServiceHost(Object, Uri[]) para crear este tipo de servicio. Ofrece una alternativa para implementar un System.ServiceModel.Dispatcher.IInstanceContextInitializer personalizado cuando desee proporcionar una instancia de objeto concreta para su uso con el servicio de singleton. Puede utilizar esta sobrecarga cuando el tipo de implementación del servicio es difícil de construir (por ejemplo, si no implementa un constructor público sin parámetros).

Tenga en cuenta que cuando se le proporciona un objeto a este constructor, algunas características relacionadas con el comportamiento de creación de instancias de Windows Communication Foundation (WCF) funcionan de manera diferente. Por ejemplo, llamar a InstanceContext.ReleaseServiceInstance , no tiene ningún efecto cuando se proporciona una instancia de objeto conocida. De igual forma, se omite cualquier otro mecanismo de lanzamiento de instancia. La clase ServiceHost siempre se comporta como si la propiedad OperationBehaviorAttribute.ReleaseInstanceMode se hubiese establecido en ReleaseInstanceMode.None para todas las operaciones.

Otros comportamientos de servicio, extremo, contrato y operación

Los comportamientos de servicios, como el atributo ServiceBehaviorAttribute , funcionan en a lo largo de todo un servicio. Por ejemplo, si establece la propiedad ServiceBehaviorAttribute.ConcurrencyMode en ConcurrencyMode.Multiple debe administrar usted mismo los problemas de sincronización de subprocesos dentro de cada operación de ese servicio. Los comportamientos de extremos funcionan a lo largo de un extremo; muchos de los comportamientos de extremo proporcionados por el sistema se han creado para ofrecer funcionalidad de cliente. Los comportamientos de contratos funcionan en el nivel del contrato y los comportamientos de operaciones modifican la entrega de la operación.

Muchos de estos comportamientos se implementan en atributos y usted los utiliza como lo haría con los atributos ServiceBehaviorAttribute y OperationBehaviorAttribute ; aplicándolos a la clase de servicio o implementación de operaciones adecuada. Otros comportamientos, como los objetos ServiceMetadataBehavior o ServiceDebugBehavior , se aplican, normalmente, mediante un archivo de configuración de la aplicación, aunque pueden usarse mediante programación.

Por ejemplo, la publicación de metadatos se configura utilizando el objeto ServiceMetadataBehavior . El siguiente archivo de configuración de la aplicación muestra el uso más común.

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

Las secciones siguientes describen muchos de los comportamientos proporcionados por el sistema más útiles que puede utilizar para modificar la entrega en tiempo de ejecución de su servicio o cliente. Vea el tema de referencia para determinar cómo utilizar cada uno.

Comportamientos de servicio

Los siguientes comportamientos funcionan en servicios.

Comportamientos del extremo

Los siguientes comportamientos funcionan en extremos. Muchos de estos comportamientos se utilizan en aplicaciones de cliente.

  • CallbackBehaviorAttribute. Configura una implementación de servicio de devolución de llamada en una aplicación cliente dúplex.

  • CallbackDebugBehavior. Habilita la depuración de servicio para un objeto de devolución de llamada de WCF.

  • ClientCredentials. Permite al usuario configurar las credenciales de cliente y servicio, así como los valores de autenticación de credenciales de servicio para su uso en el cliente.

  • ClientViaBehavior. Utilizado por clientes para especificar el Identificador uniforme de recursos (URI) para el que se debería crear el canal de transporte.

  • MustUnderstandBehavior. Indica a WCF que deshabilite el procesamiento de MustUnderstand.

  • SynchronousReceiveBehavior. Indica al tiempo de ejecución que utilice un proceso de recepción sincrónico para los canales.

  • TransactedBatchingBehavior. Optimiza las operaciones de recepción para los transportes que admiten recepciones transaccionales.

Comportamientos de contrato

DeliveryRequirementsAttribute. Especifica los requisitos de características que los enlaces deben proporcionar al servicio o implementación del cliente.

Comportamientos de la operación

Los siguientes comportamientos de operación especifican los controles de serialización y transacción de las operaciones.

Consulte también