2012-08-28 66 views
4

我有一個連接到WCF服務的Silverlight應用程序。在我習慣的基本配置下,將此應用程序連接到相應的WCF服務沒有任何問題。WCF背後的公共反向代理,用於流量加密

但是,最近,我的一個客戶開始使用Apache反向代理。此代理是公共服務器,它僅用於通過客戶端和它之間的SSL(HTTPS)加密HTTP通信。此代理將所有流量從它傳遞到承載我的應用程序的實際Web服務器。公共代理和IIS服務器之間的通信只是簡單的HTTP。

所以交通流量這樣的:承載WCF服務 最終用戶瀏覽器--- HTTPS ---->公共反向代理----- HTTP ----> IIS服務器。

反向代理和IIS位於兩臺獨立的服務器上。

我無法讓Silverlight應用程序正常工作。我不知道如何配置端點?每當我使用公共代理的地址作爲我的端點地址時,我都會遇到問題。

Silverlight應用程序通常有以下配置:

<configuration> 
    <system.serviceModel> 
     <bindings> 
      <basicHttpBinding> 
       <binding name="BasicHttpBinding_IPOTemplateEditorSrv" maxBufferSize="2147483647" 
        maxReceivedMessageSize="2147483647"> 
        <security mode="TransportWithMessageCredential" /> 
       </binding> 
      </basicHttpBinding> 
     </bindings> 
     <client> 
      <endpoint address="https://public-reverse-proxy-url/POTemplateEditorSrv.svc" 
       binding="basicHttpBinding" bindingConfiguration="BasicHttpBinding_IPOTemplateEditorSrv" 
       contract="POEditorSrvRef.IPOTemplateEditorSrv" name="BasicHttpBinding_IPOTemplateEditorSrv" /> 
     </client> 
    </system.serviceModel> 
</configuration> 

請注意,我用的,我有我的端點地址指向反向代理的公共地址HTTPS。

我錯過了什麼?是否有任何其他信息來配置代理?任何可以讓我的Silverlight客戶端連接到服務的解決方法?

+0

當您在瀏覽器中輸入URL(https://public-reverse-proxy-url/POTemplateEditorSrv.svc)時,您可以直接訪問服務嗎? – boris

+0

是的,我可以。我實際上已經嘗試過,並且在訪問該頁面時看到由WCF生成的頁面沒有任何問題。當我這樣做的時候,我得到的頁面告訴我「你已經創建了一個服務,爲了測試這個服務,你需要創建一個客戶端並用它來調用服務,你可以使用svcutil.exe來完成。 ..(我截斷了我得到的其他消息)「 –

+0

當您嘗試從Silverlight進行連接時,您會看到什麼樣的問題? 我的下一步將是在IE9(F12)或Fiddler中啓動開發人員工具,並查看Silverlight客戶端生成的請求(如果有)以及它得到的響應(如果有)。 – boris

回答

3

也許這個答案有點太明顯了,但它聽起來像WSDL宣佈內部主機名作爲WCF地址 - 當該地址不是真正的公共地址時。 因爲IIS正在生成WSDL,所以它只會在端點地址中使用它的主機名 - 這不是你想要的,你想要代理的地址。

嘗試創建WSDL文件的靜態副本,並將其發佈到Web服務器上。確保使用公共代理主機名將所有參考替換爲內部主機名。 然後修改您的WCF客戶端配置以指向靜態WSDL。 您可以在這裏找到一個簡短的說明:Supply a different endpoint address in the WSDL of a WCF web service

如果不工作 - 嘗試使用嗅探器(Wireshark的)捕捉到的是什麼來回傳送 - 禁用HTTPS可能是你需要從方程式中移除了一塊。 您的網絡服務請求似乎發送給代理,但代理無法正確處理請求 - 這是嘗試我們的嗅探工具的完美場景。

當您進行直接要求使用web瀏覽器SVC,請求會是這個樣子

GET /POTemplateEditorSrv.svc HTTP/1.1 
Host: public-reverse-proxy-url 

但是,當通過Silverlight的發送,它可能看起來像這樣

GET /POTemplateEditorSrv.svc HTTP/1.1 
Host: private-server-address 

這可能是一個微妙的差異來破壞代理。

+0

+1很好的答案。具體而言(根據包含的鏈接),更改'中的''值。您不需要在Web服務器上託管文件;你可以簡單地從桌面上「發現」它。 –

+0

好的,謝謝Adam。我會嘗試這一點,並在一兩天內回覆你! –

+0

我還沒有在客戶端的服務器上試過這個,但這個解決方案對我來說很合理,我會接受它。 –