Служба WCF: WSHttpBinding

Я создал тестовое собственное приложение wcf и попытался добавить поддержку https. Код серверного приложения:

using System;
using System.Security.Cryptography.X509Certificates;
using System.ServiceModel;
using System.ServiceModel.Description;
using System.ServiceModel.Security;

namespace SelfHost
{
    class Program
    {
        static void Main(string[] args)
        {
            string addressHttp = String.Format("http://{0}:8002/hello", System.Net.Dns.GetHostEntry("").HostName);
            Uri  baseAddress = new Uri(addressHttp);
            WSHttpBinding b = new WSHttpBinding();
            b.Security.Mode = SecurityMode.Transport;
            b.Security.Transport.ClientCredentialType = HttpClientCredentialType.Certificate;
            Uri a = new Uri(addressHttp);
            Uri[] baseAddresses = new Uri[] { a };
            ServiceHost sh = new ServiceHost(typeof(HelloWorldService), baseAddresses);
            Type c = typeof(IHelloWorldService);
            sh.AddServiceEndpoint(c, b, "hello");
            sh.Credentials.ServiceCertificate.SetCertificate(
                StoreLocation.LocalMachine,
                StoreName.My,
                X509FindType.FindBySubjectName,"myCert");
             sh.Credentials.ClientCertificate.Authentication.CertificateValidationMode =
             X509CertificateValidationMode.PeerOrChainTrust;
            try
            {
                sh.Open();

                string address = sh.Description.Endpoints[0].ListenUri.AbsoluteUri;
                Console.WriteLine("Listening @ {0}", address);
                Console.WriteLine("Press enter to close the service");
                Console.ReadLine();
                sh.Close();
            }
            catch (CommunicationException ce)
            {
                Console.WriteLine("A commmunication error occurred: {0}", ce.Message);
                Console.WriteLine();
            }
            catch (System.Exception exc)
            {
                Console.WriteLine("An unforseen error occurred: {0}", exc.Message);
                Console.ReadLine();
            }
        }
    }
    [ServiceContract]
    public interface IHelloWorldService
    {
        [OperationContract]
        string SayHello(string name);
    }

    public class HelloWorldService : IHelloWorldService
    {
        public string SayHello(string name)
        {
            return string.Format("Hello, {0}", name);
        }
    }
}

Какое имя (адрес) я должен поставить в очередь

sh.AddServiceEndpoint(c, b, "hello");

потому что "привет" неверно?

Спасибо.


person jitm    schedule 17.06.2010    source источник
comment
Что вы подразумеваете под неправильным? Вы получаете ошибку - если да, то что это?? Вы не получаете сообщение об ошибке, но служба не работает должным образом?   -  person marc_s    schedule 17.06.2010
comment
Да, я получил сообщение об ошибке с текстом: Не удалось найти базовый адрес, соответствующий схеме https для конечной точки с привязкой WSHttpBinding. Зарегистрированные схемы базовых адресов: [http].   -  person jitm    schedule 17.06.2010


Ответы (2)


По сути, третий параметр в AddServiceEndpoint — это адрес службы.

Если вы определили базовый адрес (как у вас - http://{0}:8002/hello), это относительный адрес - он будет добавлен к базовому адресу для соответствующего протокола.

Итак, в вашем случае, добавив эту конечную точку службы, вы получите конечную точку по адресу:

http://{0}:8002/hello/hello

Можете ли вы подключиться к этой конечной точке и поговорить со службой??

Или вы можете определить полностью указанный адрес — это особенно полезно, если у вас нет базовых адресов. Если вы укажете полный адрес, будет использоваться этот адрес (переопределяющий заданный базовый адрес). Итак, если вы используете:

AddServiceEndpoint(c, b, "http://server:8888/HelloService")

тогда ваша служба будет доступна по этому конкретному URL-адресу - независимо от вашего базового адреса, определенного ранее.

Обновление: спасибо за ваш комментарий. Да, если вы определяете режим безопасности как «Транспортный», вам нужно использовать https:// для всех ваших адресов.

Определение базового адреса:

string addressHttp = String.Format("https://{0}:8002/hello", System.Net.Dns.GetHostEntry("").HostName);

или переопределение с полным адресом:

AddServiceEndpoint(c, b, "https://server:8888/HelloService")
person marc_s    schedule 17.06.2010
comment
Спасибо, в настоящее время сервер запущен без ошибок, но если я попытаюсь привязать клиентскую часть к серверу, я получаю следующую ошибку: Произошла ошибка при загрузке 'сервер:8002/hello'. Базовое соединение было закрыто: при отправке произошла непредвиденная ошибка. Аутентификация не удалась, так как удаленная сторона закрыла транспортный поток. Метаданные содержат неразрешимую ссылку: 'server:8002/hello. Продолжение сообщения об ошибке в следующем комментарии... - person jitm; 17.06.2010
comment
Произошла ошибка при отправке HTTP-запроса к server:8002/hello. Это может быть связано с тем, что сертификат сервера не настроен должным образом с помощью HTTP.SYS в случае HTTPS. Это также может быть вызвано несоответствием привязки безопасности между клиентом и сервером. Базовое соединение было закрыто: при отправке произошла непредвиденная ошибка. Аутентификация не удалась, так как удаленная сторона закрыла транспортный поток. Если служба определена в текущем решении, попробуйте создать решение и снова добавить ссылку на службу. Как это исправить? - person jitm; 17.06.2010
comment
В случае, если я делаю httpcfg запрос ssl, я вижу настраиваемый HTTP.SYS -------------------------------------------------- ---------------------------------------------------------- IP: 0.0.0.0:8002 Хэш: 1111111111111111111111111111111111111 Guid: {00000000-0000-0000-0000-000000000000} CertStoreName: (NULL) CertCheckMode: 0 RevocationFreshnessTime: 0 UrlRetrievalTimeout: 0 SslCtlIdentifier: (NULL) SslCtlStoreName: (NULL) Флаги: 0 - person jitm; 17.06.2010

person    schedule
comment
Например, строка addressHttp = String.Format(http://{0}:8002/hello, System.Net.Dns.GetHostEntry().HostName); только изменения https? - person jitm; 17.06.2010