使用 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:443 和 http:pre.company.es:80,还有我的 URIs 。 *baseaddress*:_http://preserver:49759/vdir1/SilverlightServices/serv.svc 和 pre.company.es/vdir1/SilverlightServices/serv.svc 这将是 地址 ?以上是关于使用 http 和 https 绑定/端点部署 WCF 服务的主要内容,如果未能解决你的问题,请参考以下文章
从 http 到 https,得到“找不到与绑定 WebHttpBinding 的端点的方案 http 匹配的基地址”
WCF Web 服务未部署在 localhost ... web.config ... 端点上
找不到与具有绑定 WebHttpBinding 的端点的方案 https 匹配的基地址。注册的基地址方案是 [http]