这个问题的变化已经被问到了所有问题,通过这些问题,我能够在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
时,我会看到默认服务屏幕并显示正确的网址,例如svcutil https://externaldomain/svc.cs?wsdl
我有两个问题:
https://externaldomain/svc.cs?wsdl
未显示WSDL,则会重定向回默认服务屏幕。我仍然可以通过:https://externaldomain/svc.cs/mex
在Visual Studio中添加对此服务的引用,但我希望WSDL也可用。 有人能否指出我需要更改以解决这两个问题的一些文档?我的服务配置如下。
<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>
--------- EDIT -----------
使用HTTP传输进行端点下载的问题对我来说有点'呃'。在端点的绑定中,我指定:
<httpTransport maxReceivedMessageSize="2147483600" decompressionEnabled="true" />
将此更改为httpsTransport
会使用https传输添加服务引用,但客户端应用程序无法访问端点。由于负载均衡器通过http进行通信,因此传输必须保持为http。我可以使用https绑定来指定第二个端点,但这很麻烦。
我仍然没有想出wsdl问题。
答案 0 :(得分:0)
我过去做过类似的事情。我有一个基于sql的路由表来选择&#34;路由到&#34;(R2)服务器(webserver1,webserver2)。因此,我的负载均衡器接收消息,然后根据消息中的某些值选择R2服务器,并将其传递给R2服务器(在R2上调用Web服务)。
SOAP在邮件头中维护安全信息。 (https://msdn.microsoft.com/en-us/library/ms951257.aspx)。所以我做的是一旦消息到达负载均衡器,我创建了一个新的消息实例,并将传入消息中的所有属性分配给新消息。这意味着新邮件将不会与传入邮件具有相同的标头。这意味着我们应该能够将新消息发送到http。
R2服务器处理该消息并将确认发送回负载均衡器。最后,负载均衡器将确认传递给客户端。最重要的一点是负载均衡器和R2服务器应该具有相同的wsdl。让我们知道你如何使用它。