我有一个通过http公开端点的Windows服务。这也是一个Windows服务(不是在iis中托管的Web服务)。然后我使用javascript / ajax从此端点调用方法。一切都很完美,这是我在Windows服务中使用的代码来创建端点:
//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 :(得分:0)
我在这里遇到同样的问题。当前页面为http时,您似乎无法对https页面执行ajax调用。就像你不能打电话给其他域名一样。这违反了SOP http://code.google.com/p/google-web-toolkit-doc-1-5/wiki/FAQ_SOP