在负载均衡器和SSL

时间:2016-01-12 20:26:05

标签: c# web-services wcf https wsdl

这个问题的变化已经被问到了所有问题,通过这些问题,我能够在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

我有两个问题:

  1. 如果我尝试导航到https://externaldomain/svc.cs?wsdl未显示WSDL,则会重定向回默认服务屏幕。我仍然可以通过:https://externaldomain/svc.cs/mex在Visual Studio中添加对此服务的引用,但我希望WSDL也可用。
  2. 当我将服务引用添加到Visual Studio时,添加到配置的绑定被设置为httpTransport,端点指向http而不是https。如果我手动将其更改为https传输并将URL更改为端点的https,则一切正常。这不太理想。
  3. 有人能否指出我需要更改以解决这两个问题的一些文档?我的服务配置如下。

    <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问题。

1 个答案:

答案 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。让我们知道你如何使用它。