WCF 绑定到 HTTPS

Posted

技术标签:

【中文标题】WCF 绑定到 HTTPS【英文标题】:WCF Binding to HTTPS 【发布时间】:2013-01-14 17:05:29 【问题描述】:

我知道有很多关于此的帖子,并且我已经浏览了所有在我的搜索中出现的帖子并实施了提到的所有内容。我有一个 WCF Web 服务,可以在我的本地系统上运行 HTTP,它也可以在服务器上运行 HTTP。但是客户端要求它通过 HTTPS 工作。这个网站和其他网站上的大量帖子告诉我,这并不像应有的那么简单,因为在此之前,ASMX Web 服务“正常工作”并且不需要复杂的配置。

我的当前配置出现以下错误:

找不到与方案 https 匹配的基地址 具有绑定 WSHttpBinding 的端点。注册的基地址方案 是 [http]。

这是我目前的代码,经过几天的尝试配置它无济于事:

<system.serviceModel>

    <!--     -->
    <serviceHostingEnvironment  aspNetCompatibilityEnabled="true" >
        <baseAddressPrefixFilters>
            <add prefix="https://mysite.com"/>
            <add prefix="http://mysite.com"/>
        </baseAddressPrefixFilters>
    </serviceHostingEnvironment>

    <!-- Set up Custom Behaviors -->    
    <behaviors>

        <endpointBehaviors>
        </endpointBehaviors>

        <serviceBehaviors>
            <behavior name="WebPostService.WebPostServiceBehavior">
                <serviceMetadata httpsGetEnabled="true" httpsGetUrl="WebPostServices.svc/mex"  /> 
                <serviceDebug includeExceptionDetailInFaults="false" />
            </behavior>
        </serviceBehaviors>

    </behaviors>

    <!-- Set up the binding configuration  -->
    <bindings>

        <wsHttpBinding>
            <binding    name="SOAPBinding" 
            >

                <security mode="Transport">
                </security>
            </binding>
        </wsHttpBinding>

    </bindings>

    <services>

        <service    
                    behaviorConfiguration="WebPostService.WebPostServiceBehavior"
                    name="WebPostService.WebPostService"
        >

    <host>
      <baseAddresses>
        <add baseAddress="https://mysite.com/Services/WebPostService.svc"/>
      </baseAddresses>
    </host>
            <endpoint   address="" 
                        binding="wsHttpBinding" 
                        bindingConfiguration="SOAPBinding"
                        contract="WebPostService.IWebPostService"
            >
                <identity>
                    <dns value="mysite.com" />
                </identity>
            </endpoint>

            <endpoint   
                        address="mex" 
                        binding="mexHttpsBinding" 
                        contract="IMetadataExchange" 
            >
            </endpoint>

        </service>

    </services>

</system.serviceModel>

我做错了什么,我怎样才能让它通过 HTTPS 工作?我很沮丧,这并不像它应该的那么简单。在这个项目上工作的几个月里,我一直在 MSDN 的 WCF 文档中埋头苦干,并且对服务、端点和绑定有很好的掌握——这比我完全不了解更让我感到沮丧。

更新:仍在处理此问题,但在尝试为 mex 地址输入完整 URL 时遇到了一个奇怪的错误。我改成这样:

address="https://prcwebs.com/Services/WebPostService.svc/mex" 

并得到错误:

此服务的安全设置需要 Windows 身份验证,但 托管此服务的 IIS 应用程序未启用它。

我没有尝试使用 Windows 身份验证,安全设置没有更改,仍然设置为

Could not find a base address that matches scheme https for the endpoint with binding WebHttpBinding. Registered base address schemes are [http] - 没有帮助,没有提到会有所帮助 Could not find a base address that matches scheme http for the endpoint with binding WSHttpBinding - 我正在使用运输安全,这不适用。尝试更改为不同的安全模式,仍然无法使网站正常工作。

【问题讨论】:

您是在本地运行服务并收到 HTTPS 错误,还是由 IIS 提供服务而您收到该错误? 它由 IIS 提供服务。在本地,我没有设置 HTTPS,只是创建了默认项目,一切正常。发布到 Web 服务器时,一切正常,直到我尝试使用 HTTPS 访问该站点,这让我经历了异常困难的迭代,以修复 web.config 以使用 HTTPS,这看起来很简单,但到目前为止没有任何效果。 如果托管在 IIS 中,则不需要任何基地址。 我认为基地址是必要的,因为有多个地址应用于此服务器。如果我删除它,它会给我错误“这个集合已经包含一个带有方案 http 的地址。这个集合中的每个方案最多可以有一个地址。参数名称:项目” 不应基于服务器,而应基于部署此服务的网站。 【参考方案1】:

multipleSiteBindingsEnabled="true" 添加到serviceHostingEnvironment 并更新安全性以禁用客户端凭据:

<security mode="Transport">
    <transport clientCredentialType="None"></transport>
</security>

编辑 我在 windows 2003 下的最终工作版本是以下配置。

<system.serviceModel>
    <serviceHostingEnvironment  aspNetCompatibilityEnabled="false" />

    <!-- Set up Custom Behaviors -->    
    <behaviors>
        <endpointBehaviors>
        </endpointBehaviors>
        <serviceBehaviors>
            <behavior name="WebPostService.WebPostServiceBehavior">
                <serviceMetadata httpsGetEnabled="true" httpsGetUrl="WebPostServices.svc/mex"  /> 
                <serviceDebug includeExceptionDetailInFaults="false" />
            </behavior>
        </serviceBehaviors>
    </behaviors>

    <!-- Set up the binding configuration  -->
    <bindings>
        <wsHttpBinding>
            <binding name="SOAPBinding">
                <security mode="Transport">
                  <transport clientCredentialType="None"/>
                </security>
            </binding>
        </wsHttpBinding>
    </bindings>

    <services>
        <service behaviorConfiguration="WebPostService.WebPostServiceBehavior"
                 name="WcfService2.Service1">

            <host>
                <baseAddresses>
                    <add baseAddress="https://localhost/Service/Service1.svc"/>
                </baseAddresses>
            </host>
            <endpoint address="" 
                      binding="wsHttpBinding" 
                      bindingConfiguration="SOAPBinding"
                      contract="WcfService2.IService1">
                <identity>
                    <dns value="localhost" />
                </identity>
            </endpoint>

            <endpoint address="mex" 
                      binding="mexHttpsBinding" 
                      contract="IMetadataExchange">
            </endpoint>
        </service>
    </services>
</system.serviceModel>

您可以使用 https 访问该网站,所以我猜安装的证书部分是正确的。如果您有任何想与我的设置进行比较的内容,请告诉我。

【讨论】:

“multipleSiteBindingsEnabled 不是 serviceHostingEnvironment 的有效参数”它在 .NET 3.5 中无效。 另一个尝试(我正在尝试用.NET4.5复制它)完全删除baseAddressPrefixFilters标签,这解决了这里的问题。 不,如果我删除 baseAddressPrefixFilters,我会收到错误消息“此集合已包含具有方案 http 的地址。此集合中每个方案最多可以有一个地址。参数名称:项目”。 您在什么操作系统上托管您的网站?我将尝试在特定的操作系统中复制问题。 是的,Windows Server 2003,我真的认为这是一个配置错误的 SSL 证书。我不知道,这需要的时间太长了。【参考方案2】:

您使用了错误的 HTTPS 绑定。

有两个单独的绑定类。 wsHttpBinding 和 wsHttpsBinding 通知 s。 您需要在绑定下为 HTTPS 添加一个 wsHttpsBinding,并且您需要为该绑定创建一个新端点。

此外,您通常会看到特定错误,我可以查看是否没有从该位置为 https 设置 IIS。

打开 IIS 管理器 打开网站 右键单击默认网站。 编辑绑定 确保有 https 和 http 条目。
打开 IIS 管理器 找到您的应用程序(我认为它会成为默认网站)。 右键单击 管理网站/应用程序 高级设置 启用的协议 http,https

【讨论】:

它不是默认网站,它是数百个网站之一。此特定站点有一个 HTTPS 条目。这是 IIS 6,在 MMC 中该特定 DNS 项目的 IP 地址具有为 SSL 端口 443 设置的 SSL 身份。至于 wsHttpsBinding,我收到错误:“无法识别元素 'wsHttpsBinding'。”我认为在 .NET 4.0 之前不支持此功能【参考方案3】:

我在 3.5 设置中使用了您的确切配置,它使用 clientCredentialType="None"Transport 模式一起使用,如下 Lu​​uk 的回答中所述。但为了确定起见,我继续创建了一个示例项目,以尽可能多地模拟您从此处的信息中收集到的环境。

为了模拟您的环境,我将 IIS (7.5) 设置为使用标准 Asp.Net 2.0 Integrated 应用程序池。我添加了 3 个 http 绑定和 3 个 https 绑定,以模拟您的“每个方案问题只能有一个地址”,baseAddressPrefixFilters 可以使用它。

我只对mysite.com 进行了搜索并将其替换为localhost。下面是我用来生成屏幕截图的确切配置的复制粘贴:

web.config

<?xml version="1.0"?>
<configuration>
  <system.web>
    <compilation debug="true" />
    <authentication mode="None"/>
    <customErrors mode="Off"/>
  </system.web>
  <system.serviceModel>
    <!--     -->
    <serviceHostingEnvironment aspNetCompatibilityEnabled="true">
      <baseAddressPrefixFilters>
        <add prefix="https://localhost"/>
        <add prefix="http://localhost"/>
      </baseAddressPrefixFilters>
    </serviceHostingEnvironment>
    <!-- Set up Custom Behaviors -->
    <behaviors>
      <endpointBehaviors/>
      <serviceBehaviors>
        <behavior name="WebPostService.WebPostServiceBehavior">
          <serviceMetadata httpsGetEnabled="true" httpsGetUrl="WebPostServices.svc/mex"/>
          <serviceDebug includeExceptionDetailInFaults="false"/>
        </behavior>
      </serviceBehaviors>
    </behaviors>
    <!-- Set up the binding configuration  -->
    <bindings>
      <wsHttpBinding>
        <binding name="SOAPBinding">
          <security mode="Transport">
            <transport clientCredentialType="None"/>
          </security>
        </binding>
      </wsHttpBinding>
    </bindings>
    <services>
      <service behaviorConfiguration="WebPostService.WebPostServiceBehavior" name="WebPostService.WebPostService">
        <host>
          <baseAddresses>
            <add baseAddress="https://localhost/Services/WebPostService.svc"/>
          </baseAddresses>
        </host>
        <endpoint address="" binding="wsHttpBinding" bindingConfiguration="SOAPBinding" contract="WebPostService.IWebPostService">
          <identity>
            <dns value="localhost"/>
          </identity>
        </endpoint>
        <endpoint address="mex" binding="mexHttpsBinding" contract="IMetadataExchange"/>
      </service>
    </services>
  </system.serviceModel>
</configuration>

结果如下:

您会注意到WebPostService.svcmex 完整网址中出现了两次。您需要将 httpsGetUrl 删除为仅 mex 而不是 WebPostService.svc/mex (或完全删除它,它在我这边仍然可以正常工作)

如果您想讨论这个或除了 IIS 版本之外我们的环境之间可能有什么不同,我几乎整天都在 WPF 聊天室(另外 5-6 小时)。

【讨论】:

【参考方案4】:

我用过这个,它对我有用,也许它可以帮助你

要在 WCF WsHttp 绑定上启用 Https,应该在 web.config 文件中更改一些简单的步骤。

这些步骤是:

在服务的 web.config 文件中启用传输级安全性:

在此步骤中,您需要将安全模式从无更改为传输。下面的代码展示了如何做到这一点:

<bindings>
    <wsHttpBinding>
        <binding name="TransportSecurity">
            <security mode="Transport">
                <transport clientCredentialType="None"/>
            </security>
        </binding>
    </wsHttpBinding>
</bindings>

绑定绑定并指定HTTPS配置

您现在需要将绑定、预览步骤与端点关联起来。使用 bindingConfiguration 标记来指定绑定名称。您还需要指定托管服务的地址。下面的代码展示了如何做到这一点

<service name="WCFWSHttps.Service1" behaviorConfiguration="WCFWSHttps.Service1Behavior">
<!-- Service Endpoints -->
    <endpoint address=https://localhost/WCFWSHttps/Service1.svc binding="wsHttpBinding"  bindingConfiguration="TransportSecurity" contract="WCFWSHttps.IService1"/>
    <endpoint address="mex" binding="mexHttpsBinding" contract="IMetadataExchange"/>
</service>

。 您还需要在 serviceMetaData 中将 httpGetEnabled 更改为 httpsGetEnabled。下面的代码展示了如何做到这一点:

<serviceMetadata httpsGetEnabled="true"/> 

希望对你有帮助

【讨论】:

以上是关于WCF 绑定到 HTTPS的主要内容,如果未能解决你的问题,请参考以下文章

WCF 绑定到 HTTPS

将 HTTPS 绑定添加到 IIS 后,具有 Windows 身份验证的 WCF SOAP Web 服务停止工作

WCF自寄宿实现Https绑定

在 http 和 https 上具有自定义绑定的 WCF

WCF 通讯标准绑定

使用 http 和 https 绑定/端点部署 WCF 服务