【发布时间】:2016-04-17 15:03:52
【问题描述】:
这个问题的变体已经被问遍了,通过这些问题,我已经能够获得 90% 的配置,但我仍然遇到一些问题。我的设置如下所示:
(http://server1)
----------------
--> -- webserver1 --
/ ----------------
/
(https://externaldomain)/
---------------------- /
--- load balancer ----
---------------------- \
\
\
\ (http://server2)
--> ----------------
-- webserver2 --
----------------
我已经指定了
<useRequestHeadersForMetadataAddress>
<defaultPorts>
<add scheme="https" port="443" />
</defaultPorts>
</useRequestHeadersForMetadataAddress>
我已将 httpGetEnabled 设置为 false 并将 httpsGetEnabled 设置为 true。结果是,当我导航到 https://externaldomain 时,我看到了默认服务屏幕,它显示了正确的 URL,例如svcutilhttps://externaldomain/svc.cs?wsdl
我有两个问题:
- 如果我尝试导航到
https://externaldomain/svc.cs?wsdl,则不会显示 WSDL,而是将我重定向回默认服务屏幕。我仍然可以通过https://externaldomain/svc.cs/mex在 Visual Studio 中添加对此服务的引用,但我希望 WSDL 也可用。 - 当我将服务引用添加到 Visual Studio 时,添加到配置的绑定设置为 httpTransport,并且端点指向 http 而不是 https。如果我手动将其更改为 https 传输并将端点的 URL 更改为 https,则一切正常。这并不理想。
有人可以指出我需要更改哪些文档来解决这两个问题吗?我的服务的配置如下。
<system.serviceModel>
<client>
<endpoint address="http://internalService" binding="basicHttpBinding" bindingConfiguration="BasicHttpBinding_IMessageProcessing" contract="IMessageProcessing" name="BasicHttpBinding_IMessageProcessing" />
</client>
<services>
<service behaviorConfiguration="ProcessBehavior" name="Service">
<host>
<baseAddresses>
<add baseAddress="https://externaldomain/Service.svc" />
</baseAddresses>
</host>
<endpoint binding="customBinding" bindingConfiguration="CompressionBinding" name="CompressionBindingEndpoint" contract="IService" />
<endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange" />
</service>
</services>
<behaviors>
<serviceBehaviors>
<behavior name="ProcessBehavior">
<serviceThrottling maxConcurrentCalls="100" />
<serviceMetadata httpsGetEnabled="true" httpGetEnabled="false" />
<useRequestHeadersForMetadataAddress>
<defaultPorts>
<add scheme="https" port="443" />
</defaultPorts>
</useRequestHeadersForMetadataAddress>
<serviceDebug includeExceptionDetailInFaults="true" />
<!--<serviceThrottling maxConcurrentCalls="200"/>-->
</behavior>
<behavior name="metadataSupport">
<serviceMetadata httpGetEnabled="false" httpsGetEnabled="true" />
</behavior>
</serviceBehaviors>
</behaviors>
<bindings>
<basicHttpBinding>
<binding name="BasicHttpBinding_IMessageProcessing" />
</basicHttpBinding>
<customBinding>
<binding name="CompressionBinding" closeTimeout="00:05:00" openTimeout="00:05:00" receiveTimeout="00:15:00" sendTimeout="01:30:00">
<binaryMessageEncoding compressionFormat="GZip" />
<httpTransport maxReceivedMessageSize="2147483600" decompressionEnabled="true" />
</binding>
</customBinding>
</bindings>
</system.serviceModel>
---------编辑-----------
使用 HTTP 传输进行端点下载的问题对我来说有点“废话”。在我指定的端点绑定中:
<httpTransport maxReceivedMessageSize="2147483600" decompressionEnabled="true" />
将此更改为httpsTransport 会使用https 传输添加服务引用,但客户端应用程序随后无法到达端点。由于负载均衡器通过 http 进行通信,因此传输必须保持 http。我可以使用 https 绑定指定第二个端点,但这很麻烦。
我仍然没有弄清楚 wsdl 的问题。
【问题讨论】:
-
那么你的问题到底是什么?如何为 WCF 服务配置 SSL?
-
此问题应获得“ASCII 模式艺术家”徽章
-
我刚刚注意到,您的负载均衡器是
https。但是网络服务器是http。你打算用什么样的路由方式? -
@KosalaW 负载均衡器是终止 SSL 的 F5。我认为基础架构人员将其设置为这样,因此证书不需要位于所有 Web 服务器上。
-
您是否与基础设施人员核对,以便在 F5 中编写 iRules 以保持方案为 https,即使 SSL 已卸载,以便 https 在您的应用程序的 url 中保持一致?
标签: c# web-services wcf https wsdl