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

Posted

技术标签:

【中文标题】使用 http 和 https 绑定/端点部署 WCF 服务【英文标题】:Deploying WCF Service with both http and https bindings/endpoints 【发布时间】:2011-06-15 10:19:58 【问题描述】:

我编写了一个供 Silverlight 应用使用的 WCF Web 服务。最初,该服务只需要一个基本的 http 绑定。我们现在需要能够部署服务以在 http 和 https 下使用。我发现 web.config 的一些设置允许我执行以下操作:

<system.serviceModel>
  <behaviors>
    <endpointBehaviors>
      <behavior name="SilverlightFaultBehavior">
        <silverlightFaults />
      </behavior>
    </endpointBehaviors>
    <serviceBehaviors>
      <behavior name="CxtMappingWebService.CxtMappingWebServiceBehavior">
        <serviceMetadata httpGetEnabled="true" httpsGetEnabled="true" />
        <serviceDebug includeExceptionDetailInFaults="True" />
      </behavior>
    </serviceBehaviors>
  </behaviors>
  <bindings>
    <basicHttpBinding>
      <binding name="SecureHttpBinding">
        <security mode="Transport" />
      </binding>
      <binding name="BasicHttpBinding">
        <security mode="None" />
      </binding>
    </basicHttpBinding>
  </bindings>
  <services>
    <service name="CxtMappingWebService.CxtMappingWebService" behaviorConfiguration="CxtMappingWebService.CxtMappingWebServiceBehavior">
      <endpoint address="" bindingConfiguration="SecureHttpBinding" binding="basicHttpBinding" contract="CxtMappingWebService.ICxtMappingWebService" behaviorConfiguration="SilverlightFaultBehavior" />
      <endpoint address="" bindingConfiguration="BasicHttpBinding" binding="basicHttpBinding" contract="CxtMappingWebService.ICxtMappingWebService" behaviorConfiguration="SilverlightFaultBehavior" />
      <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange" />
    </service>
  </services>
</system.serviceModel>

不幸的是,这有一个问题。

此网络服务需要部署到我们客户的数百台服务器上,而且并非所有这些服务器都将使用 https。将其部署到没有在 IIS 中设置 https 绑定的服务器会导致它失败。如果 IIS 中没有设置 https 绑定,有没有办法在默认情况下在 web.config 中同时拥有这两个绑定而不会死掉?

对于这个问题,我们有一个可能的解决方案,但它并不能很好地满足我们的部署要求。

以前有没有人遇到过这样的事情,你是怎么解决的?

【问题讨论】:

什么是silverlightFaults 【参考方案1】:

如果您不使用安装程序,则此页面上接受的答案没有多大用处。 正确答案在于 OP 自己稍后编辑,只需在 IIS 中绑定 http 和 https 端口,然后使用下面的配置。

            <service name="CxtMappingWebService.CxtMappingWebService" behaviorConfiguration="CxtMappingWebService.CxtMappingWebServiceBehavior">
              <endpoint address="" bindingConfiguration="SecureHttpBinding" binding="basicHttpBinding" contract="CxtMappingWebService.ICxtMappingWebService" behaviorConfiguration="SilverlightFaultBehavior" />
              <endpoint address="" bindingConfiguration="BasicHttpBinding" binding="basicHttpBinding" contract="CxtMappingWebService.ICxtMappingWebService" behaviorConfiguration="SilverlightFaultBehavior" />
              <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange" />
            </service>

这对我来说效果很好!

【讨论】:

为什么我要尝试这个,我得到一个 ServiceActivationException。 ...由于编译过程中的异常而无法激活。异常消息是:Cannot add two items with the same key to SynchronizedKeyedCollection.. ---> System.ArgumentException: Cannot add two items with the same key to SynchronizedKeyedCollection【参考方案2】:

最后,我们决定使用 configSource 属性来处理 web.config 的绑定、行为和服务部分的外部文件,如下所示:

<bindings configSource="bindings.config" />
<behaviors configSource="behaviors.config" />
<services configSource="services.config" />

这样,我们默认将其部署为仅设置为 http 访问的那些外部文件,并向客户提供有关如何编辑外部文件以设置为 https 访问的说明(或协助他们)。这也允许我们在不覆盖外部配置文件的情况下将未来的更改部署到 web.config 本身。

【讨论】:

您是否尝试过任何用于 http 和 https 绑定的解决方案?是否有任何 *.configs 用于 http-https 或仅 http?【参考方案3】:

这将由您用于部署服务的安装程序处理。部署两个端点或仅部署 http 端点应该是先决条件(或至少在安装程序中保留一个选项)。

【讨论】:

【参考方案4】:

您的两个端点具有相同的 URI。这在 WCF 中是不允许的。您应该能够指定具有不同绑定的端点,但 URI 必须不同(即不同的端口号或不同的合同)。

【讨论】:

这就是我的想法,直到我以这种方式配置它只是为了看看它是否可以工作,无论出于何种原因,可能是因为 IIS 中的 https 绑定是为端口 443 设置的. 唯一不起作用的是试图让它在 IIS 没有设置 https 绑定的机器上运行。 由于合约过滤以及端点地址和listenURI之间的区别,您实际上可以在多个端点上拥有相同的地址。详情请见Multiple Endpoints at a Single ListenUri。 我在 IIS 中有这个 bindings ((type:hostname:port)):http:none hostaname:49759, https:pre.company.es:443http:pre.company.es:80,还有我的 URIs *baseaddress*:_http://preserver:49759/vdir1/SilverlightServices/serv.svcpre.company.es/vdir1/SilverlightServices/serv.svc 这将是 地址 ?

以上是关于使用 http 和 https 绑定/端点部署 WCF 服务的主要内容,如果未能解决你的问题,请参考以下文章

基于 IIS 绑定将 WCF 端点动态绑定到 HTTPS

从 http 到 https,得到“找不到与绑定 WebHttpBinding 的端点的方案 http 匹配的基地址”

WCF Web 服务未部署在 localhost ... web.config ... 端点上

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

WCF 异常:找不到与端点的方案 http 匹配的基地址

带有服务结构的 SOAP - Https 和 Http 绑定