Как создать пользовательскую привязку надежного сеанса с использованием HTTPS
В этом разделе рассматривается использование механизма обеспечения безопасности транспорта через протокол SSL и надежные сеансы. Для использования надежных сеансов через протокол HTTPS требуется создать пользовательскую привязку, использующую надежный сеанс и транспорт HTTPS. Разрешить надежный сеанс можно принудительно (в коде) или декларативно (в файле конфигурации). В этой процедуре для разрешения надежного сеанса используются файлы конфигурации клиента и службы и элемент <httpsTransport>.
Ключевой момент данной процедуры заключается том, что элемент конфигурации endpoint содержит атрибут bindingConfiguration, ссылающийся на конфигурацию пользовательской привязки с именем "reliableSessionOverHttps". Элемент конфигурации <binding> может затем ссылаться на это имя, чтобы указать, что используются надежный сеанс и транспорт HTTPS, так как включены элементы reliableSession и httpsTransport.
Копию исходного кода этого примера см. в разделе Надежный сеанс по протоколу HTTPS с использованием пользовательской привязки.
Настройка использования надежного сеанса и HTTPS службой с привязкой CustomBinding
Определите контракт службы для данного типа службы.
[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); }
Реализуйте контракт службы в классе службы. Обратите внимание, что информация об адресе или привязке не указывается внутри реализации службы. Кроме того, для извлечения этих сведений из файла конфигурации не требуется писать код.
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; } }
Создайте файл Web.config, чтобы настроить использование пользовательской привязки "reliableSessionOverHttps", использующей надежный сеанс и транспорт HTTPS, с конечной точкой службы CalculatorService.
Создайте файл Service.svc, содержащий строку:
<%@ServiceHost language=c# Service="CalculatorService" %>
Поместите файл Service.svc в виртуальный каталог IIS.
Настройка использования надежного сеанса и HTTPS клиентом с привязкой CustomBinding
Из командной строки запустите программу Служебное средство ServiceModel Metadata Utility Tool (Svcutil.exe), чтобы создать код из метаданных службы.
Svcutil.exe <service's Metadata Exchange (MEX) address or HTTP GET address>
Создаваемый клиент содержит интерфейс ICalculator, определяющий контракт службы, которому должна удовлетворять реализация клиента.
//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); }
Созданное клиентское приложение также содержит реализацию ClientCalculator. Обратите внимание, что информация об адресе и привязке нигде внутри реализации службы не указывается. Кроме того, для извлечения этих сведений из файла конфигурации не требуется писать код.
// 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); } }
Задайте пользовательской привязке "reliableSessionOverHttps" использовать транспорт HTTPS и надежные сеансы.
<?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>
Создайте экземпляр класса ClientCalculator в приложении и вызовите операции службы.
//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(); } }
Скомпилируйте и запустите клиент.
Пример
Безопасность
При попытке доступа к адресу HTTPS, такому как https://localhost/servicemodelsamples/service.svc, через обозреватель, возникает предупреждение системы безопасности, так как сертификат, используемый в этом примере, является тестовым сертификатом, созданным Makecert.exe.