Procedimiento para crear un enlace personalizado de sesión confiable con HTTPS
En este tema se muestra el uso de la seguridad de transporte de capa de sockets seguros (SSL) con sesiones confiables. Para utilizar una sesión confiable sobre HTTPS, debe crear un enlace personalizado que utilice una sesión confiable y el transporte de HTTPS. Puede habilitar la sesión confiable de manera imperativa mediante código o de manera declarativa en el archivo de configuración. Este procedimiento utiliza los archivos de configuración de servicio y cliente para habilitar la sesión confiable y el elemento <httpsTransport>.
La parte clave de este procedimiento es que el elemento de configuración del <punto de conexión> contenga un atributo bindingConfiguration
que haga referencia a una configuración de enlace personalizada denominada reliableSessionOverHttps
. El elemento de configuración de <enlace> hace referencia a este nombre para especificar que se usa una sesión confiable y el transporte HTTPS, incluidos los elementos <reliableSession> y <httpsTransport>.
Para obtener la copia de origen de este ejemplo, consulte Sesión confiable de enlace personalizado mediante HTTPS.
Configuración del servicio con un CustomBinding para utilizar una sesión confiable con HTTPS
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); }
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. No es necesario escribir código para recuperar la información de enlace o direcció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; } }
Cree un archivo Web.config para configurar un punto de conexión para el
CalculatorService
con un enlace personalizado denominadoreliableSessionOverHttps
que utilice una sesión confiable y el transporte de HTTPS.<?xml version="1.0" encoding="utf-8" ?> <configuration> <system.serviceModel> <services> <service name="Microsoft.ServiceModel.Samples.CalculatorService" behaviorConfiguration="CalculatorServiceBehavior"> <!-- Use base address provided by the host --> <endpoint address="" binding="customBinding" bindingConfiguration="reliableSessionOverHttps" contract="Microsoft.ServiceModel.Samples.ICalculator" /> <!-- The mex endpoint is exposed as http://localhost/servicemodelsamples/service.svc/mex --> <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange" /> </service> </services> <bindings> <customBinding> <binding name="reliableSessionOverHttps"> <reliableSession /> <httpsTransport /> </binding> </customBinding> </bindings> </system.serviceModel> </configuration>
Cree un archivo Service.svc que contenga la línea:
<%@ServiceHost language=c# Service="CalculatorService" %>
Coloque el archivo Service.svc en el directorio virtual de Internet Information Services (IIS).
Configuración del cliente con un CustomBinding para utilizar una sesión confiable con HTTPS
Use 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 <Metadata Exchange (MEX) address or HTTP GET address>
El cliente que se genera contiene la interfaz
ICalculator
que define el contrato de servicio 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); }
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. No es necesario escribir código para recuperar la información de enlace y direcció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); } }
Configure un enlace personalizado denominado
reliableSessionOverHttps
para que use el transporte HTTPS y sesiones confiables.<?xml version="1.0" encoding="utf-8" ?> <configuration> <system.serviceModel> <client> <!-- This endpoint has an https address --> <endpoint name="" address="https://localhost/servicemodelsamples/service.svc" binding="customBinding" bindingConfiguration="reliableSessionOverHttps" contract="Microsoft.ServiceModel.Samples.ICalculator" /> </client> <bindings> <customBinding> <binding name="reliableSessionOverHttps"> <reliableSession /> <httpsTransport /> </binding> </customBinding> </bindings> </system.serviceModel> </configuration>
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(); } }
Compile y ejecute el cliente.
seguridad en .NET Framework
Dado que el certificado utilizado en este ejemplo es un certificado de prueba creado con Makecert.exe, aparece una alerta de seguridad al intentar tener acceso a una dirección HTTPS: como https://localhost/servicemodelsamples/service.svc
, en su explorador.