Ajax通过ssl(https)调用wcf windows服务

时间:2010-03-06 13:36:26

标签: 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.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到达我的服务。

在这一点上我完全失去了,我觉得一切都到位了,我只是看不出问题所在。如果有人有这方面的经验,请提供您的见解和/或解决方案!

谢谢!

1 个答案:

答案 0 :(得分:0)

我在这里遇到同样的问题。当前页面为http时,您似乎无法对https页面执行ajax调用。就像你不能打电话给其他域名一样。这违反了SOP http://code.google.com/p/google-web-toolkit-doc-1-5/wiki/FAQ_SOP