通过ssl(https)对wcf windows服务的Ajax调用
我有一个通过http公开端点的windows服务。同样,这是一个windows服务(不是iis中托管的web服务)。然后,我使用javascript/ajax从该端点调用方法。一切都很完美,这就是我在windows服务中用于创建端点的代码:通过ssl(https)对wcf windows服务的Ajax调用,ajax,wcf,windows-services,https,Ajax,Wcf,Windows Services,Https,我有一个通过http公开端点的windows服务。同样,这是一个windows服务(不是iis中托管的web服务)。然后,我使用javascript/ajax从该端点调用方法。一切都很完美,这就是我在windows服务中用于创建端点的代码: //Create host object WebServiceHost webServiceHost = new WebServiceHost(svcHost.obj, new Uri("http://192.168.0.10
//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页面的指导,如下所示:
我使用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访问我的服务
在这一点上我完全不知所措,我觉得一切都准备好了,我只是看不出问题出在哪里。如果任何人有此场景的经验,请提供您的见解和/或解决方案
谢谢 我这里也有同样的问题。当当前页面为http时,似乎无法对https页面进行ajax调用。就像你不能调用其他域一样。这违反了SOP也可能是浏览器不信任SSL证书
CN=bpCertTest
,如果它是为测试而创建的自签名证书,或者颁发给的地址与您传递给服务主机的Uri不匹配,则肯定会出现这种情况。