我有一个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,则它们还必须共享相同的绑定对象实例。
但是我需要两种不同的绑定-一种具有客户端证书要求,而另一种没有。
可行吗?
谢谢
答案 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>