Compartir a través de


Intercambio de mensajes dentro de una sesión confiable

En este tema se describen los pasos necesarios para habilitar una sesión confiable utilizando uno de los enlaces proporcionados por el sistema que admiten este tipo de sesión, pero no de forma predeterminada. Puede habilitar la sesión confiable de manera imperativa mediante código o de manera declarativa mediante configuración. Este procedimiento utiliza los archivos de configuración de cliente y servicio para habilitar la sesión confiable y para estipular que los mensajes lleguen en el mismo orden en el que se enviaron.

La parte clave de este procedimiento es que el elemento de configuración del extremo contenga un atributo bindingConfiguration que haga referencia a una configuración de enlace denominada "Binding1". El elemento de configuración <binding>enabled puede hacer referencia a continuación a este nombre para habilitar las sesiones confiables estableciendo el atributo reliableSession del elementotrue en . Especifica las garantías de entrega ordenada de la sesión confiable estableciendo el atributo ordered en true.

Para la copia de origen de este ejemplo, vea Sesión de confianza de WS.

Configuración del servicio con WSHttpBinding para utilizar una sesión confiable

  1. Defina un contrato de servicios para el tipo de servicio.

    [ServiceContract]
    public interface ICalculator
    {
       [OperationContract]
       double Add(double n1, double n2);
       [OperationContract]
       double Subtract(double n1, double n2);
       [OperationContract]
       double Multiply(double n1, double n2);
       [OperationContract]
       double Divide(double n1, double n2);
    }
    
  2. Implemente el contrato de servicios en una clase de servicio. Observe que la información de enlace o dirección no se especifica en ninguna parte de la implementación del servicio. Además, el código tiene que escribirse para recuperar esa información del archivo de configuración.

    public class CalculatorService : ICalculator
    {
       public double Add(double n1, double n2)
       {
          return n1 + n2;
       }
       public double Subtract(double n1, double n2)
       {
          return n1 - n2;
       }
       public double Multiply(double n1, double n2)
       {
          return n1 * n2;
       }
       public double Divide(double n1, double n2)
       {
          return n1 / n2;
       }
    } 
    
  3. Cree un archivo Web.config para configurar un extremo del CalculatorService que utiliza el WSHttpBinding con sesión confiable habilitada y entrega ordenada de mensajes requerida..

  4. Cree un archivo Service.svc que contenga la línea:

    <%@ServiceHost language=c# Service="CalculatorService" %> 
    
  5. Coloque el archivo Service.svc en el directorio virtual de Internet Information Services (IIS).

Configuración del cliente con un WSHttpBinding para utilizar una sesión confiable

  1. Utilice la Herramienta de utilidad de metadatos de ServiceModel (Svcutil.exe) desde la línea de comandos para generar código a partir de los metadatos del servicio:

    Svcutil.exe <service's Metadata Exchange (MEX) address or HTTP GET address> 
    
  2. El cliente que se genera contiene la interfaz ICalculator que define el contrato de servicios que la implementación del cliente debe cumplir.

    //Generated interface defining the ICalculator contract   
        [System.ServiceModel.ServiceContractAttribute(
        Namespace="http://Microsoft.ServiceModel.Samples",              ConfigurationName="Microsoft.ServiceModel.Samples.ICalculator")]
        public interface ICalculator
        {
    
            [System.ServiceModel.OperationContractAttribute(
        Action="http://Microsoft.ServiceModel.Samples/ICalculator/Add",         ReplyAction="http://Microsoft.ServiceModel.Samples/ICalculator/AddResponse")]
            double Add(double n1, double n2);
    
                [System.ServiceModel.OperationContractAttribute(
        Action="http://Microsoft.ServiceModel.Samples/ICalculator/Subtract",    ReplyAction="http://Microsoft.ServiceModel.Samples/ICalculator/SubtractResponse")]
            double Subtract(double n1, double n2);
    
                [System.ServiceModel.OperationContractAttribute(
        Action="http://Microsoft.ServiceModel.Samples/ICalculator/Multiply",    ReplyAction="http://Microsoft.ServiceModel.Samples/ICalculator/MultiplyResponse")]
            double Multiply(double n1, double n2);
    
                [System.ServiceModel.OperationContractAttribute(
        Action="http://Microsoft.ServiceModel.Samples/ICalculator/Divide",  ReplyAction="http://Microsoft.ServiceModel.Samples/ICalculator/DivideResponse")]
            double Divide(double n1, double n2);
        }
    
  3. La aplicación de cliente generada también contiene la implementación de ClientCalculator. Observe que la información de enlace y dirección no se especifica en ninguna parte de la implementación del servicio. Además, el código tiene que escribirse para recuperar esa información del archivo de configuración.

    // Implementation of the CalculatorClient
    public partial class CalculatorClient :         System.ServiceModel.ClientBase<Microsoft.ServiceModel.Samples.ICalculator>,         Microsoft.ServiceModel.Samples.ICalculator
    {
    
        public CalculatorClient()
        {
        }
    
        public CalculatorClient(string endpointConfigurationName) : 
                base(endpointConfigurationName)
        {
        }
    
        public CalculatorClient(string endpointConfigurationName, string remoteAddress) : 
                base(endpointConfigurationName, remoteAddress)
        {
        }
    
        public CalculatorClient(string endpointConfigurationName, 
                System.ServiceModel.EndpointAddress remoteAddress) : 
                base(endpointConfigurationName, remoteAddress)
        {
        }
    
        public CalculatorClient(System.ServiceModel.Channels.Binding binding,                 System.ServiceModel.EndpointAddress remoteAddress) : 
                base(binding, remoteAddress)
        {
        }
    
        public double Add(double n1, double n2)
        {
            return base.Channel.Add(n1, n2);
        }
    
        public double Subtract(double n1, double n2)
        {
            return base.Channel.Subtract(n1, n2);
        }
    
        public double Multiply(double n1, double n2)
        {
            return base.Channel.Multiply(n1, n2);
        }
    
        public double Divide(double n1, double n2)
        {
            return base.Channel.Divide(n1, n2);
        }
    }
    
    
    
  4. Svcutil.exe también genera la configuración para el cliente que utiliza la clase WSHttpBinding. Este archivo se debería denominar App.config al utilizar Visual Studio.

    <?xml version="1.0" encoding="utf-8" ?>
    <configuration>
      <system.serviceModel>
    
        <client>
          <endpoint 
              address="https://localhost/servicemodelsamples/service.svc" 
    
              <!-- specify wsHttpBinding binding and a binding configuration to use. -->
              binding="wsHttpBinding" 
              bindingConfiguration="Binding1" 
              contract="Microsoft.ServiceModel.Samples.ICalculator" />
        </client>
    
        <!-- Configures WSHttpBinding for reliable sessions with ordered delivery. -->
        <bindings>
          <wsHttpBinding>
            <binding name="Binding1">
              <reliableSession enabled="true"
                   ordered="true" />
            </binding>
          </wsHttpBinding>
        </bindings>
    
      </system.serviceModel>
    
    </configuration>
    
  5. Cree una instancia de ClientCalculator en una aplicación y, a continuación, llame a las operaciones del servicio.

    //Client implementation code.
    class Client
    {
        static void Main()
        {
            // Create a client with given client endpoint configuration
            CalculatorClient client = new CalculatorClient();
    
            // Call the Add service operation.
            double value1 = 100.00D;
            double value2 = 15.99D;
            double result = client.Add(value1, value2);
            Console.WriteLine("Add({0},{1}) = {2}", value1, value2, result);
    
            // Call the Subtract service operation.
            value1 = 145.00D;
            value2 = 76.54D;
            result = client.Subtract(value1, value2);
            Console.WriteLine("Subtract({0},{1}) = {2}", value1, value2, result);
    
            // Call the Multiply service operation.
            value1 = 9.00D;
            value2 = 81.25D;
            result = client.Multiply(value1, value2);
            Console.WriteLine("Multiply({0},{1}) = {2}", value1, value2, result);
    
            // Call the Divide service operation.
            value1 = 22.00D;
            value2 = 7.00D;
            result = client.Divide(value1, value2);
            Console.WriteLine("Divide({0},{1}) = {2}", value1, value2, result);
    
            //Closing the client gracefully closes the connection and cleans up resources
            client.Close();
    
            Console.WriteLine();
            Console.WriteLine("Press <ENTER> to terminate client.");
            Console.ReadLine();
        }
    }
    
  6. Compile y ejecute el cliente.

Ejemplo

Algunos de los enlaces proporcionados por el sistema admiten de forma predeterminada las sesiones confiables. Éstos incluyen:

Para obtener un ejemplo sobre cómo crear un enlace personalizado que admita sesiones confiables, vea Creación de un enlace personalizado de sesión confiable con HTTPS.

Vea también

Otros recursos

Sesiones de confianza