WCF服务的多个HTTPS端点

时间:2018-10-04 14:10:27

标签: c# wcf https endpoint

我有一个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,则它们还必须共享相同的绑定对象实例。

但是我需要两种不同的绑定-一种具有客户端证书要求,而另一种没有。

可行吗?

谢谢

1 个答案:

答案 0 :(得分: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>