WCF REST服务HTTP / HTTPS端口共享

时间:2019-01-21 16:34:23

标签: rest http wcf https wcf-binding

我正在尝试将WCF REST服务配置为可以使用HTTP以及使用HTTPS进行访问。

由于这是生产中的服务,因此我想最小化启动和运行HTTPS所需的更改。我想实现一种解决方案,其中管理员只需将 http:// 替换为 https:// 。根据此Wcf HTTP and HTTPS on the same host/port,应该有可能实现这一目标,但是我在配置上苦苦挣扎。

<services>
    <service name="My.Server">      
        <!-- HTTP services -->
        <endpoint address="/Common/"
                  behaviorConfiguration="restEndpointBehavior"
                  binding="webHttpBinding"
                  contract="My.IServer" />      
        <!-- HTTPS services -->
        <endpoint address="/Common/"
                  behaviorConfiguration="restEndpointBehavior"
                  binding="webHttpBinding"
                  bindingConfiguration="httpsBindingConfiguration"
                  contract="My.IServer" />
        <host>
            <baseAddresses>
                <add baseAddress="http://localhost:8732/MyService" />
                <add baseAddress="https://localhost:8732/MyService" />
            </baseAddresses>
        </host>
    </service>
</services>

只要我只使用HTTP或HTTPS绑定(使用Postman测试),一切都可以正常工作,但是一旦激活两个端点,服务启动就会失败:

服务无法启动。 System.ServiceModel.AddressAlreadyInUseException:HTTP无法注册URL https://+:8732/MyService/Common/。另一个应用程序已经使用HTTP.SYS注册了该URL。 ---> System.Net.HttpListenerException:无法侦听前缀“ https://+:8732/MyService/Common/”,因为它与计算机上的现有注册冲突。

我知道所有 netsh http urlacl | sslcert 的东西,并且可以确认这些问题不成问题,因为仅使用一个端点(HTTP或HTTPS )或更改HTTPS的端口,例如:8733 解决了该问题,该服务按预期进行了响应,但是如前所述,我想使用相同的端口。

经过研究并尝试了一段时间后,我猜测是不支持这种配置。任何人都可以证实我的猜测或知道达到预期结果的方法吗?

1 个答案:

答案 0 :(得分:0)

您知道这些endpoints应当使用不同的bindingConfiguration,我为端口http上的服务设置了https80,它们运行良好,但在定义以下配置之前,我没有做任何事情:

<webHttpBinding>
  <binding allowCookies="true" openTimeout="00:00:10" maxReceivedMessageSize="20000000">
    <readerQuotas maxDepth="32" maxArrayLength="200000000" maxStringContentLength="200000000" />
    <security mode="None" />
  </binding>
  <binding name="secureWebHttpBinding">
    <security mode="Transport">
      <transport clientCredentialType="None" />
    </security>
  </binding>
</webHttpBinding>

然后像这样定义endpoints

<service behaviorConfiguration="Commom2.Behavior" name="name"> 
  <endpoint address="rest" behaviorConfiguration="Rest.Behavior" binding="webHttpBinding"  contract="x">
    <identity>
      <dns value="localhost" />
    </identity>
  </endpoint>
  <endpoint address="rest" behaviorConfiguration="Rest.Behavior" binding="webHttpBinding" bindingConfiguration="secureHttpBinding" contract="x">
    <identity>
      <dns value="localhost" />
    </identity>
  </endpoint>
  <host>
    <baseAddresses>
      <add baseAddress="http://localhost/serviceName.svc" />
    </baseAddresses>
  </host>
</service>

注意:
我启用了https绑定并在那里上传了有效证书,并且您已经在baseAddresses上配置了一个http,正如您在配置中看到的那样,但是该服务可以在http://localhost/serviceName.svc/rest和{ {1}}

您的问题可能是因为有两个https://localhost/serviceName.svc/rest,并且为baseAddresses注册了错误的端口。