无法通过 https 访问 WCF 服务

Posted

技术标签:

【中文标题】无法通过 https 访问 WCF 服务【英文标题】:Can't access WCF service through https 【发布时间】:2017-12-01 01:14:03 【问题描述】:

我设置了一个由 Windows 服务托管的 WCF 应用程序。我让它正常工作,我可以通过转到http://127.0.0.1:1214 导航到它。这是配置:

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
    <system.serviceModel>
        <services>
            <service name="NetworkPrintClient.PrintWebService" behaviorConfiguration="PrintServiceBehavior">
                <host>
                    <baseAddresses>
                        <add baseAddress="http://127.0.0.1:1214/"/>
                    </baseAddresses>
                </host>
                <endpoint address="" binding="wsHttpBinding" contract="NetworkPrintClient.IPrintWebService" />
                <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange" />
            </service>
        </services>
        <behaviors>
            <serviceBehaviors>
                <behavior name="PrintServiceBehavior">
                    <serviceMetadata httpGetEnabled="true" />
                    <serviceDebug includeExceptionDetailInFaults="False"/>
                </behavior>
            </serviceBehaviors>
        </behaviors>
    </system.serviceModel>
</configuration>

现在我想通过https://127.0.0.1:1214 访问它。在阅读了几篇关于这样做的文章后,我最终得到了下面的配置。但是,我不能再浏览到应用程序了。我只是在 Chrome 中收到“无法访问此站点”错误。

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
    <system.serviceModel>
        <services>
            <service name="NetworkPrintClient.PrintWebService" behaviorConfiguration="PrintServiceBehavior">
                <host>
                    <baseAddresses>
                        <add baseAddress="https://127.0.0.1:1214/"/>
                    </baseAddresses>
                </host>
                <endpoint address="" binding="webHttpBinding" contract="NetworkPrintClient.IPrintWebService" behaviorConfiguration="HttpBehavior" bindingConfiguration="PrintServiceHttpsBinding"/>
                <endpoint address="mex" binding="mexHttpsBinding" contract="IMetadataExchange" />
            </service>
        </services>
        <behaviors>
            <serviceBehaviors>
                <behavior name="PrintServiceBehavior">
                    <serviceMetadata httpsGetEnabled="true" />
                    <serviceDebug includeExceptionDetailInFaults="False"/>
                </behavior>
            </serviceBehaviors>
            <endpointBehaviors>
                <behavior name="HttpBehavior">
                    <webHttp />
                </behavior>
            </endpointBehaviors>
        </behaviors>
        <bindings>
            <webHttpBinding>
                <binding name="PrintServiceHttpsBinding">
                    <security mode="Transport">
                        <transport clientCredentialType="None" />
                    </security>
                </binding>
            </webHttpBinding>
        </bindings>
        <protocolMapping>
            <add binding="webHttpBinding" scheme="https"/>
        </protocolMapping>
    </system.serviceModel>
</configuration>

到目前为止,我使用的文章是here。我在底部做了关于制作证书并将其映射到我的 IP 和端口的部分。我还试图让它与“localhost”和我的实际 IP 地址一起使用。谁能看到我做错了什么?

【问题讨论】:

您是否尝试过使用 WCF 测试客户端访问您的服务? docs.microsoft.com/en-us/dotnet/framework/wcf/… - 我发现在某些情况下这很有帮助。另外,我建议您从上面的工作版本重新开始,然后在所有其余部分中一块一块地粘上胶水,同时确保每个步骤仍然有效。 【参考方案1】:
    您必须创建一个自托管到 localhost 的证书,您可以在 powersheel 中使用此命令行 New-SelfSignedCertificate -DnsName "localhost", "localhost" -CertStoreLocation "cert:\LocalMachine\My" 当您执行时将生成证书的指纹,并与端口相关联,例如“B80BE75765AA5739EAC63AAF67C32E5A3625FF19 " 在窗口中键入“证书”并单击管理计算机证书并将证书从个人\证书复制到受信任的根证书颁发机构\证书 将证书哈希(指纹与端口)关联 - netsh http add sslcert ipport=0.0.0.0:0 certhash=1 appid=2 certstore=MY 0 - 端口- 1 -(证书生成的指纹)2 - 555b2e5f-4877-459b-bff2-60bb25898455(GUID)

【讨论】:

非常感谢您的帮助!我相信这是我错过的第 2 步。我按照我引用的指南查看了我所做的事情,但我没有将我的证书移动到受信任的根目录。之后,一切都按预期进行。

以上是关于无法通过 https 访问 WCF 服务的主要内容,如果未能解决你的问题,请参考以下文章

Silverlight+WCF项目Https配置

通过 HTTPS 和 HTTP 访问时,WCF 服务不工作

WCF 服务端点无法从本地访问

Windows Phone 8.0 上的 HTTPS WCF 服务:无法进行身份验证

无法通过 Safari 使用 Kerberos 约束委派通过 Web 应用程序访问后端 WCF 服务

我们可以在跨域中使用 Jquery $.ajax() 调用通过 https 访问 WCF 服务吗?