Procedura: creare un'associazione di sessione affidabile personalizzata con HTTPS
In questo argomento viene illustrato l'uso della protezione del trasporto SSL (Secure Sockets Layer) con sessioni affidabili. Per usare una sessione affidabile su HTTPS è necessario creare un'associazione personalizzata che usa una sessione affidabile e il trasporto HTTPS. È possibile attivare la sessione affidabile in modo imperativo, mediante codice, o in modo dichiarativo, nel file di configurazione. In questa procedura vengono usati i file di configurazione del client e del servizio per attivare la sessione affidabile e l'elemento <httpsTransport>.
La parte principale della procedura è rappresentata dall'elemento di configurazione <endpoint> che contiene un attributo bindingConfiguration
che fa riferimento a una configurazione di associazione denominata reliableSessionOverHttps
. L'elemento di configurazione <binding> fa riferimento a questo nome per specificare che una sessione affidabile e il trasporto HTTPS vengono usati includendo gli elementi <reliableSession> e <httpsTransport>.
Per la copia di origine di questo esempio, vedere Sessione affidabile di associazione personalizzata su HTTPS.
Configurare il servizio con una CustomBinding per usare una sessione affidabile con HTTPS
Definire un contratto di servizio per il tipo di servizio.
[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); }
Implementare il contratto di servizio in una classe del servizio. Si noti che le informazioni sull'indirizzo o sull'associazione non sono specificate nell'implementazione del servizio. Non è necessario scrivere codice per recuperare l'indirizzo o le informazioni di associazione dal file di configurazione.
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; } }
Creare un file Web.config per configurare un endpoint per
CalculatorService
con un'associazione personalizzata denominatareliableSessionOverHttps
che usa una sessione affidabile e il trasporto 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>
Creare un file Service.svc che contenga la riga:
<%@ServiceHost language=c# Service="CalculatorService" %>
Posizionare il file Service.svc nella directory virtuale di Internet Information Services (IIS).
Configurare il client con una CustomBinding per usare una sessione affidabile con HTTPS
Utilizzare lo strumento ServiceModel Metadata Utility Tool (Svcutil.exe) dalla riga di comando per generare il codice dai metadati di servizio.
Svcutil.exe <Metadata Exchange (MEX) address or HTTP GET address>
Il client generato contiene l'interfaccia
ICalculator
che definisce il contratto di servizio che l'implementazione del client deve soddisfare.// 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); }
L'applicazione client generata contiene inoltre l'implementazione di
ClientCalculator
. Si noti che le informazioni sull'indirizzo e sull'associazione non sono specificate nell'implementazione del servizio. Non è necessario scrivere codice per recuperare l'indirizzo e le informazioni di associazione dal file di configurazione.// 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); } }
Configurare un'associazione personalizzata denominata
reliableSessionOverHttps
per usare il trasporto HTTPS e sessioni affidabili.<?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>
Creare un'istanza di
ClientCalculator
in un'applicazione, quindi chiamare le operazioni del servizio.//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(); } }
Compilare ed eseguire il client.
.NET Framework (sicurezza)
Poiché il certificato usato in questo esempio è un certificato di prova creato con Makecert.exe, viene visualizzato un avviso di sicurezza quando si tenta di accedere a un indirizzo HTTPS, quale https://localhost/servicemodelsamples/service.svc
, dal browser.