У меня есть служба Windows, которая предоставляет конечную точку через http. Опять же это служба Windows (а не веб-сервис, размещенный в iis). Затем я вызываю методы с этой конечной точки, используя javascript/ajax. Все прекрасно работает, и это код, я использую в моей службе Windows, чтобы создать конечную точку:Ajax call to wcf windows service over ssl (https)
//Create host object
WebServiceHost webServiceHost = new WebServiceHost(svcHost.obj, new Uri("http://192.168.0.100:1213"));
//Add Https Endpoint
WebHttpBinding binding = new WebHttpBinding();
webServiceHost.AddServiceEndpoint(svcHost.serviceContract, binding, string.Empty);
//Add MEX Behaivor and EndPoint
ServiceMetadataBehavior metadataBehavior = new ServiceMetadataBehavior();
metadataBehavior.HttpGetEnabled = true;
webServiceHost.Description.Behaviors.Add(metadataBehavior);
webServiceHost.AddServiceEndpoint(ServiceMetadataBehavior.MexContractName, MetadataExchangeBindings.CreateMexHttpBinding(), "mex");
webServiceHost.Open();
Теперь моя цель состоит в том, чтобы получить эту же модель работает над SSL (HTTPS не HTTP). Таким образом, я следовал указаниям нескольких страниц MSDN, как следующее:
http://msdn.microsoft.com/en-us/library/ms733791(VS.100).aspx
Я использовал Makecert.exe создать тестовый сертификат под названием «bpCertTest». Затем я использовал netsh.exe для настройки моего порта (1213) с помощью тестового сертификата, который я создал, без проблем. Затем я изменил код конечной точки в моей службе Windows, чтобы иметь возможность работать над HTTPS следующим образом:
//Create host object
WebServiceHost webServiceHost = new WebServiceHost(svcHost.obj, new Uri("https://192.168.0.100:1213"));
//Add Https Endpoint
WebHttpBinding binding = new WebHttpBinding();
binding.Security.Mode = WebHttpSecurityMode.Transport;
binding.Security.Transport.ClientCredentialType = HttpClientCredentialType.Certificate;
webServiceHost.AddServiceEndpoint(svcHost.serviceContract, binding, string.Empty);
webServiceHost.Credentials.ServiceCertificate.SetCertificate("CN=bpCertTest", StoreLocation.LocalMachine, StoreName.My);
//Add MEX Behaivor and EndPoint
ServiceMetadataBehavior metadataBehavior = new ServiceMetadataBehavior();
metadataBehavior.HttpsGetEnabled = true;
webServiceHost.Description.Behaviors.Add(metadataBehavior);
webServiceHost.AddServiceEndpoint(ServiceMetadataBehavior.MexContractName, MetadataExchangeBindings.CreateMexHttpsBinding(), "mex");
webServiceHost.Open();
Служба создает конечную точку успешно, узнает мой сертификат в вызове SetCertificate(), и обслуживание запускается и работает с успехом.
Теперь проблема заключается в том, что мой вызов javascript/ajax не может связываться со службой через https. Я просто получаю некоторую общую ошибку обработки (12031). Итак, в качестве теста я изменил порт, который я вызывал в javascript, на какой-то другой случайный порт, и я получаю ту же ошибку, которая говорит мне, что я, очевидно, даже не добираюсь до службы по https.
В настоящий момент у меня полная потеря, я чувствую, что все на месте, и я просто не вижу, в чем проблема. Если у кого-то есть опыт в этом сценарии, пожалуйста, предоставьте ваше понимание и/или решение!
Спасибо!
Также возможно, что браузер не доверяет SSL-сертификату 'CN = bpCertTest', который определенно имеет место, если он является самозаверяющим, созданным для тестирования, или выданный на адрес не сопоставьте Uri, который вы передаете на хост службы. –