【发布时间】:2010-03-06 13:36:25
【问题描述】:
我有一个 Windows 服务,它通过 http 公开一个端点。同样,这是一个 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 访问我的服务。
在这一点上我完全不知所措,我觉得一切都已经到位,我只是看不出问题出在哪里。如果有人在这种情况下有经验,请提供您的见解和/或解决方案!
谢谢!
【问题讨论】:
-
也有可能是浏览器不信任 SSL 证书
CN=bpCertTest,如果它是为测试而创建的自签名证书,或者发出的地址与您要传递给服务主机的 Uri。
标签: ajax wcf windows-services https