Compartir a través de


Especificación del comportamiento del servicio Run-Time

Una vez que haya diseñado un contrato de servicio (Diseñar contratos de servicio) e implementado el contrato de servicio (Implementar contratos de servicio), puede configurar el comportamiento de operación del tiempo de ejecución del servicio. En este tema se describen los comportamientos de servicio y operación 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 mediante un archivo de configuración de aplicación o mediante programación. Para obtener más información sobre cómo configurar la aplicación de servicio, consulte Configuring Services.

Información general

El contrato define las entradas, salidas, tipos de datos y funcionalidades 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. Todos los datos contractuales, vinculantes y de dirección son conocidos por el cliente; sin ellos, el cliente no puede usar el servicio.

Sin embargo, los detalles de la operación, como los problemas de subproceso o la administración de instancias, son opacos para los clientes. Una vez implementado el contrato de servicio, puede configurar un gran número de características de operación mediante 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 tiempo de ejecución. Para obtener más información sobre cómo modificar el tiempo de ejecución mediante la creación de comportamientos definidos por el usuario, consulte Extensión de ServiceHost y la capa de modelo de servicio.

Los System.ServiceModel.ServiceBehaviorAttribute atributos y System.ServiceModel.OperationBehaviorAttribute son los comportamientos más útiles y exponen las características de operación solicitadas con más frecuencia. Dado que son atributos, los aplica a la implementación del servicio o de la operación. Otros comportamientos, como el System.ServiceModel.Description.ServiceMetadataBehavior o el System.ServiceModel.Description.ServiceDebugBehavior, se aplican normalmente mediante un archivo de configuración de aplicación, aunque puede aplicarlos mediante programación.

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

ServiceBehaviorAttribute y OperationBehaviorAttribute

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

  • Duración de la instancia

  • Soporte para concurrencia y sincronización

  • Comportamiento de configuración

  • Comportamiento de la 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 usar estos atributos, marque el servicio o la implementación de la operación con el atributo adecuado para 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 debe configurarse para usar un enlace que admita transacciones fluyedas.

Well-Known Singleton Services

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

Por ejemplo, la propiedad ServiceBehaviorAttribute.InstanceContextMode controla la frecuencia con la que se libera InstanceContext, y las propiedades OperationBehaviorAttribute.ReleaseInstanceMode y ServiceBehaviorAttribute.ReleaseServiceInstanceOnTransactionComplete controlan cuándo se libera el objeto de servicio.

Sin embargo, también puede crear un objeto de servicio usted mismo y crear el host de servicio mediante ese objeto. Para ello, también debe establecer la propiedad ServiceBehaviorAttribute.InstanceContextMode en Single, de lo contrario, se producirá una excepción cuando se abre el host de servicio.

Use el ServiceHost(Object, Uri[]) constructor para crear este servicio. Proporciona una alternativa a la implementación personalizada de un System.ServiceModel.Dispatcher.IInstanceContextInitializer al desear proporcionar una instancia de un objeto específico para su uso en un servicio singleton. Puede usar esta sobrecarga cuando el tipo de implementación de servicio sea difícil de construir (por ejemplo, si no implementa un constructor público sin parámetros).

Tenga en cuenta que cuando se 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 forma diferente. Por ejemplo, llamar a InstanceContext.ReleaseServiceInstance no tiene ningún efecto cuando se proporciona una instancia de objeto conocida. Del mismo modo, se omite cualquier otro mecanismo de liberación de instancia. La ServiceHost clase siempre se comporta como si la propiedad OperationBehaviorAttribute.ReleaseInstanceMode se establece en ReleaseInstanceMode.None para todas las operaciones.

Otros comportamientos de servicio, punto de conexión, contrato y operación

Los comportamientos de servicio, como el ServiceBehaviorAttribute atributo , funcionan en todo un servicio. Por ejemplo, si establece la propiedad ServiceBehaviorAttribute.ConcurrencyMode a ConcurrencyMode.Multiple, debe controlar usted mismo los problemas de sincronización de subprocesos dentro de cada operación en ese servicio. Los comportamientos del punto de conexión funcionan en un punto de conexión; muchos de los comportamientos de punto de conexión proporcionados por el sistema son para la funcionalidad del cliente. Los comportamientos del contrato se implementan a nivel de contrato, y los comportamientos de operación modifican la ejecución 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 ServiceMetadataBehavior objetos o ServiceDebugBehavior , se aplican normalmente mediante un archivo de configuración de aplicación, aunque también se pueden usar mediante programación.

Por ejemplo, la publicación de metadatos se configura mediante el ServiceMetadataBehavior objeto . 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>

En las secciones siguientes se describen muchos de los comportamientos proporcionados por el sistema más útiles que puede usar para modificar la entrega en tiempo de ejecución del servicio o cliente. Consulte el tema de referencia para determinar cómo usar cada uno.

Comportamientos de servicio

Los comportamientos siguientes funcionan en los servicios.

Comportamientos de punto de conexión

Los siguientes comportamientos funcionan en extremos. Muchos de estos comportamientos se usan en aplicaciones 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 la configuración de autenticación de credenciales de servicio para su uso en el cliente.

  • ClientViaBehavior. Los clientes usan para especificar el identificador uniforme de recursos (URI) para el que se debe crear el canal de transporte.

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

  • SynchronousReceiveBehavior. Indica al tiempo de ejecución que use 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 a la implementación del cliente.

Comportamientos de la operación

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

Consulte también