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 终结点的主要内容,如果未能解决你的问题,请参考以下文章

wcf 由 http 更改为 https 返回404,没有终结点在侦听可以接受消息的

WCF入门二[WCF的配置文件]

快速入门系列--WCF--04元数据和异常处理

WCF学习之旅—WCF概述

浅谈WCF

Azure Service Fabric 中 WCF 服务的 HTTP 终结点