Iis-7

如何使用負載均衡器在 IIS 中進行 WCF 服務 HTTPS 綁定和端點配置?

  • September 18, 2020

我們有一個託管在一組 12 台機器上的 WCF 服務。有一個負載均衡器是這些機器的網關。

現在該站點設置為 SSL;就像使用者通過使用帶有 https 的 URL 訪問它一樣。我知道很多,定址該站點的 URL 是 https,但沒有一個伺服器具有 https 綁定或設置為需要 SSL。這讓我相信負載均衡器處理 https 並且從均衡器到伺服器的連接是未加密的(這發生在防火牆後面,所以沒有什麼大不了的)。

我們遇到的問題是,當 Silverlight 客戶端嘗試訪問 WCF 服務時,它會收到“未找到”錯誤。我已經與我們的開發人員機器一起建立了一個測試站點,並確保 web.config 中的綁定和端點與客戶端一起工作。在生產環境中似乎是出現此錯誤的情況。

下面的 web.config 有什麼問題嗎?我們是否應該設置如何以不同的方式處理 https?

我們目前對此感到茫然,因為我已經嘗試了每個帶有端點和綁定的程式解決方案。我發現的解決方案都沒有像我們處理的那樣處理負載均衡器。

Web.config 服務模型資訊:

 <system.serviceModel>
   <behaviors>
     <serviceBehaviors>
       <behavior name="TradePMR.OMS.Framework.Services.CRM.CRMServiceBehavior">
         <serviceMetadata httpsGetEnabled="true" />
         <serviceDebug includeExceptionDetailInFaults="false" />
       </behavior>
       <behavior name="TradePMR.OMS.Framework.Services.AccountAggregation.AccountAggregationBehavior">
         <serviceMetadata httpsGetEnabled="true" />
         <serviceDebug includeExceptionDetailInFaults="false" />
       </behavior>
     </serviceBehaviors>
   </behaviors>
   <bindings>          
     <customBinding>    
       <binding name="SecureCRMCustomBinding">
         <binaryMessageEncoding />
         <httpsTransport />
       </binding>

       <binding name="SecureAACustomBinding">
         <binaryMessageEncoding />
         <httpsTransport />
       </binding>
     </customBinding>
     <mexHttpsBinding>
       <binding name="SecureMex" />
     </mexHttpsBinding>
   </bindings>
   <serviceHostingEnvironment aspNetCompatibilityEnabled="true" />

   <!--Defines the services to be used in the application-->
   <services>
     <service behaviorConfiguration="TradePMR.OMS.Framework.Services.CRM.CRMServiceBehavior"
       name="TradePMR.OMS.Framework.Services.CRM.CRMService">

       <endpoint address="" binding="customBinding" bindingConfiguration="SecureCRMCustomBinding"
         contract="TradePMR.OMS.Framework.Services.CRM.CRMService" name="SecureCRMEndpoint" />

       <!--This is required in order to be able to use the "Update Service Reference" in the Silverlight application-->
       <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange" />
     </service>

     <service behaviorConfiguration="TradePMR.OMS.Framework.Services.AccountAggregation.AccountAggregationBehavior"
       name="TradePMR.OMS.Framework.Services.AccountAggregation.AccountAggregation">

       <endpoint address="" binding="customBinding" bindingConfiguration="SecureAACustomBinding"
         contract="TradePMR.OMS.Framework.Services.AccountAggregation.AccountAggregation" name="SecureAAEndpoint" />

       <!--This is required in order to be able to use the "Update Service Reference" in the Silverlight application-->
       <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange" />
     </service>
   </services>
 </system.serviceModel>
</configuration>

ServiceReferences.ClientConfig 如下所示:

<configuration>
   <system.serviceModel>
       <bindings>
           <customBinding>
               <binding name="StandardAAEndpoint">
                   <binaryMessageEncoding />
                   <httpTransport maxReceivedMessageSize="2147483647" maxBufferSize="2147483647" />
               </binding>
               <binding name="SecureAAEndpoint">
                   <binaryMessageEncoding />
                   <httpsTransport maxReceivedMessageSize="2147483647" maxBufferSize="2147483647" />
               </binding>
               <binding name="StandardCRMEndpoint">
                   <binaryMessageEncoding />
                   <httpTransport maxReceivedMessageSize="2147483647" maxBufferSize="2147483647" />
               </binding>
               <binding name="SecureCRMEndpoint">
                   <binaryMessageEncoding />
                   <httpsTransport maxReceivedMessageSize="2147483647" maxBufferSize="2147483647" />
               </binding>
           </customBinding>
       </bindings>
       <client>
           <endpoint address="https://Service2.svc"
               binding="customBinding" bindingConfiguration="SecureAAEndpoint"
               contract="AccountAggregationService.AccountAggregation" name="SecureAAEndpoint" />
           <endpoint address="https://Service1.svc"
               binding="customBinding" bindingConfiguration="SecureCRMEndpoint"
               contract="CRMService.CRMService" name="SecureCRMEndpoint" />
       </client>
   </system.serviceModel>
</configuration>

(地址無關緊要,因為它們是動態建構的,因此它們將指向開發人員的機器或生產伺服器)

我正在回答這個問題,因為一些知道該應用程序正在生產中但在這裡沒有看到答案的人問我。

在上述情況下,我們無法解決這個問題。從客戶端到負載均衡器的 HTTPS 正常。問題是當負載平衡器獲取該連接並將其指向未加密格式的 Web 伺服器時。這似乎破壞了 WCF 協議。客戶端正在發送 HTTPS 通信,但伺服器正在獲取未加密的通信。

我們通過所有 SSL 通信解決了這個問題。

最好的“解決方案”是查看您的 WCF 服務是否沒有使用 HTTP 傳輸方法,並設置您的負載平衡器以不改變地傳遞這些通信。然後,負載均衡器可以對網站生成的正常 HTTPS 流量執行其標準操作程序。

我沒有對此進行測試,因為我們的應用場景需要 WCF 服務與 ASP.NET 兼容。

希望其他人可以詳細說明這一點,並提供更多資訊。

引用自:https://serverfault.com/questions/80719