WCF 服务的多个 HTTPS 终结点
Posted
技术标签:
【中文标题】WCF 服务的多个 HTTPS 终结点【英文标题】:Multiple HTTPS endpoints for WCF service 【发布时间】:2019-03-09 23:21:26 【问题描述】:我有一个使用两个端点的 WCF 服务:HTTP 和 https。 我需要添加另一个 https 端点,以便一个需要客户端证书而另一个不需要。
如果我使用自己的基地址添加新的 https 端点,我会收到错误:
System.ArgumentException:此集合已包含方案 https 的地址。此集合中的每个方案最多可以有一个地址。如果您的服务托管在 IIS 中,您可以通过将“system.serviceModel/serviceHostingEnvironment/multipleSiteBindingsEnabled”设置为 true 或指定“system.serviceModel/serviceHostingEnvironment/baseAddressPrefixFilters”来解决问题。
我尝试添加
<serviceHostingEnvironment multipleSiteBindingsEnabled="true">
</serviceHostingEnvironment>
但它没有帮助 - 得到同样的错误。
如果我使用相同的 Listen Uri 但不同的绑定配置添加新的 https 端点,则会出现错误:
System.InvalidOperationException:绑定实例已关联到侦听 URI 'https://localhost:9907/myservice/myservice'。如果两个端点想要共享同一个 ListenUri,它们也必须共享同一个绑定对象实例。
但我需要两种不同的绑定 - 一种具有客户端证书要求,另一种没有。
可行吗?
谢谢
【问题讨论】:
我看不出您如何支持同一个 URL 上的多个绑定。客户端和服务器如何知道使用哪个握手?您必须(稍微)改变 URL 并有两个端点定义。 我以为我可以使用两个不同的 URL,但它似乎不允许我为同一个服务使用两个 https URL 【参考方案1】:我想通了。 两个 https 端点必须使用相同的绑定类型而不是相同的绑定配置,并且还具有不同的名称,如下所示:
<system.serviceModel>
<serviceHostingEnvironment multipleSiteBindingsEnabled="true">
</serviceHostingEnvironment>
<bindings>
<basicHttpBinding>
<binding name="BasicHttpBinding" />
<binding name="HTTPSNoCert">
<security mode="Transport" />
</binding>
<binding name="HTTPSWithCert">
<security mode="Transport">
<message clientCredentialType="Certificate" />
</security>
</binding>
</basicHttpBinding>
</bindings>
<services>
<service name="WcfServiceLibrary1.Service1">
<endpoint address="b1" binding="basicHttpBinding" bindingConfiguration="BasicHttpBinding"
name="BhttpEP" contract="WcfServiceLibrary1.IService1">
<identity>
<dns value="localhost" />
</identity>
</endpoint>
<endpoint address="mex" binding="mexHttpBinding" name="mex" contract="IMetadataExchange" />
<endpoint address="bs1" binding="basicHttpBinding" bindingConfiguration="HTTPSNoCert"
name="bHttpsEP1" contract="WcfServiceLibrary1.IService1" />
<endpoint address="bs2" binding="basicHttpBinding" bindingConfiguration="HTTPSWithCert"
name="bHttpsEP2" contract="WcfServiceLibrary1.IService1" />
<host>
<baseAddresses>
<add baseAddress="http://myhostname:7654/b1" />
<add baseAddress="https://myhostname:7655/b2" />
</baseAddresses>
</host>
</service>
</services>
<behaviors>
<serviceBehaviors>
<behavior name="">
<serviceMetadata httpGetEnabled="true" httpsGetEnabled="true" />
<serviceDebug includeExceptionDetailInFaults="false" />
</behavior>
</serviceBehaviors>
</behaviors>
【讨论】:
我说得太早了。服务启动,但使用 https 调用方法失败并调用服务失败。可能原因:服务离线或无法访问;客户端配置与代理不匹配;现有代理无效。有关更多详细信息,请参阅堆栈跟踪。您可以尝试通过启动新代理、恢复到默认配置或刷新服务来恢复。以上是关于WCF 服务的多个 HTTPS 终结点的主要内容,如果未能解决你的问题,请参考以下文章