我正在尝试将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测试),一切都可以正常工作,但是一旦激活两个端点,服务启动就会失败:
我知道所有 netsh http urlacl | sslcert 的东西,并且可以确认这些问题不成问题,因为仅使用一个端点(HTTP或HTTPS )或更改HTTPS的端口,例如:8733 解决了该问题,该服务按预期进行了响应,但是如前所述,我想使用相同的端口。
经过研究并尝试了一段时间后,我猜测是不支持这种配置。任何人都可以证实我的猜测或知道达到预期结果的方法吗?
答案 0 :(得分:0)
您知道这些endpoints
应当使用不同的bindingConfiguration
,我为端口http
上的服务设置了https
和80
,它们运行良好,但在定义以下配置之前,我没有做任何事情:
<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
注册了错误的端口。