2012-03-07 46 views
2

我有一個位於負載均衡器後面的2個冗餘服務器上的Flex/CF應用程序。 Flex和CF都撥打同一個CFC。 Flex,CF和CFC都在同一個文件夾中。當CF代碼調用CFC時,沒有問題。但是,當Flex代碼調用CFC時,它將向URL添加顯式端口「84」。這對於僅接受來自端口80的流量的負載均衡器造成問題。據我所知,負載均衡器將內部路由來自端口80的請求到端口84上的2個服務器中的一個(但是內部路由對於客戶)。Flex向CFC調用添加不正確的端口

我已經在flex像這樣的代碼硬編碼的WSDL位置:

services.xxxService.wsdl = "http://devsite.xxx.com/xxx/xx/xx/xx.cfc?wsdl";

我也嘗試了相對路徑定義WSDL位置這樣的時候:

services.xxxService.wsdl = "xx/xx/xx.cfc?wsdl";

兩者都會導致Web服務調用看起來像(當我查看Charles數據包嗅探器時):

http://devsite.xxx.com:84/xxx/xx/xx/xx.cfc?wsdl

我用這個類似的設置創建了多個Flex應用程序,從來沒有這個問題。我甚至在沒有負載平衡器的情況下將此應用程序部署到多個服務器,並且我沒有看到任何Flex到CFC調用中指定的端口。

Flex如何使它通過端口號調用WSDL並且CF代碼不會?負載平衡器上發生的事情我不知道?

回答

2

這不是一個Flex問題,它是一個ColdFusion問題。默認情況下,關閉一個CFC(沒有指定其他參數)的創建的WSDL產生由內省衍生的<wsdlsoap:address location>元件。也就是說,CF服務器查看自己的本地實例的信息,並生成匹配其設置絕對URL ...

...這包括一個非標準端口,這將在您的情況表現 - 當ColdFusion服務器位於負載均衡器的後面,該負載均衡器將流量從80重定向到另一個端口。

解決方案:在CF8或更高版本,您可以添加一個新的屬性標籤,「serviceaddress」:

<cfcomponent output="false" serviceaddress="http://127.0.0.1:80/myService.cfc"> 

這將迫使CFC當請求WSDL產生正確<wsdlsoap:address location>元素。

你的CF客戶端工作正常的原因,但Flex客戶端不......是因爲CF客戶端沒有兌現XML中的WSDL地址位置,而是使用它實例化的初始地址存根。