2010-03-06 4 views
1

У меня есть служба 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.

В настоящий момент у меня полная потеря, я чувствую, что все на месте, и я просто не вижу, в чем проблема. Если у кого-то есть опыт в этом сценарии, пожалуйста, предоставьте ваше понимание и/или решение!

Спасибо!

+0

Также возможно, что браузер не доверяет SSL-сертификату 'CN = bpCertTest', который определенно имеет место, если он является самозаверяющим, созданным для тестирования, или выданный на адрес не сопоставьте Uri, который вы передаете на хост службы. –

ответ

0

У меня такая же проблема. Кажется, что вы не можете делать ajax-вызовы на странице https, пока ваша текущая страница - http. Так же, как вы не можете звонить в другие домены. Это нарушение SOP http://code.google.com/p/google-web-toolkit-doc-1-5/wiki/FAQ_SOP