Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ajax/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
通过ssl(https)对wcf windows服务的Ajax调用_Ajax_Wcf_Windows Services_Https - Fatal编程技术网

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

通过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

我有一个通过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页面的指导,如下所示:

我使用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不匹配,则肯定会出现这种情况。