Como: criar uma associação de sessão confiável personalizada com HTTPS
Este tópico demonstra o uso da segurança do transporte do protocolo SSL com sessões confiáveis. Para usar uma sessão confiável via HTTPS, você precisa criar uma associação personalizada que use uma sessão confiável e o transporte HTTPS. Habilite a sessão confiável de maneira imperativa usando o código ou por meio de declaração no arquivo de configuração. Este procedimento usa os arquivos de configuração de cliente e serviço para habilitar a sessão confiável e o elemento <httpsTransport>.
A parte chave deste procedimento é que o elemento de configuração <endpoint> contém um atributo bindingConfiguration
que referencia uma configuração de associação personalizada chamada reliableSessionOverHttps
. O elemento de configuração de associação <binding> referencia esse nome para especificar que uma sessão confiável e o transporte HTTPS são usados incluindo os elementos <reliableSession> e <httpsTransport>.
Para obter a cópia de origem deste exemplo, confira Sessão confiável de associação personalizada via HTTPS.
Configurar o serviço com um CustomBinding para usar uma sessão confiável com HTTPS
Defina um contrato de serviço para o tipo de serviço.
[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 o contrato de serviço em uma classe de serviço. Observe que as informações de endereço ou associação não são especificadas dentro da implementação do serviço. Você não precisa escrever um código para recuperar as informações de associação ou de endereço do arquivo de configuração.
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; } }
Crie um arquivo Web.config para configurar um ponto de extremidade para o
CalculatorService
com uma associação personalizada chamadareliableSessionOverHttps
que usa uma sessão confiável e o transporte 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>
Crie um arquivo Service.svc que contenha a linha:
<%@ServiceHost language=c# Service="CalculatorService" %>
Coloque o arquivo Service.svc no diretório virtual do IIS (Serviços de Informações da Internet).
Configurar o cliente com uma CustomBinding para usar uma sessão confiável com HTTPS
Use a Ferramenta de Utilitário de Metadados do ServiceModel (Svcutil.exe) na linha de comando para gerar um código com base nos metadados de serviço.
Svcutil.exe <Metadata Exchange (MEX) address or HTTP GET address>
O cliente gerado contém a interface
ICalculator
que define o contrato de serviço que a implementação do cliente precisa satisfazer.// 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); }
O aplicativo cliente gerado também contém a implementação da
ClientCalculator
. Observe que as informações de endereço e de associação não são especificadas na implementação do serviço. Você não precisa escrever um código para recuperar as informações de associação e de endereço do arquivo de configuração.// 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 uma associação personalizada chamada
reliableSessionOverHttps
para usar o transporte HTTPS e sessões confiáveis.<?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>
Crie uma instância da
ClientCalculator
em um aplicativo e chame as operações de serviço.//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 e execute o cliente.
Segurança do .NET Framework
Como o certificado usado neste exemplo é um certificado de teste criado com Makecert.exe, um alerta de segurança é exibido quando você tenta acessar um endereço HTTPS, como https://localhost/servicemodelsamples/service.svc
, no navegador.