2012-03-07 1 views
2

У меня есть приложение Flex/CF, которое находится на 2 резервных серверах за балансировщиком нагрузки. Обе стороны Flex и CF вызывают вызовы на тот же CFC. Flex, CF и CFC находятся в одной папке. Когда CF-код вызывает CFC, проблема не возникает. Однако, когда код Flex вызывает CFC, он добавляет явный порт «84» в URL. Это вызывает проблему для балансировщика нагрузки, который принимает только трафик с порта 80. Насколько я понимаю, балансировщик нагрузки запрограммировал внутренние запросы от порта 80 до 1 из 2 серверов на порту 84 (но эта внутренняя маршрутизация должна быть невидимой для клиент).Flex добавляет неверный порт для вызова CFC

Я жёстко расположение WSDL в гибком коде, как это:

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

Я также попытался относительный путь при определении местоположения WSDL как это:

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

Оба результата выглядят как вызов webservice (когда я смотрю в пакете сниффер Чарльза):

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

Я создал несколько приложений Flex с подобной настройкой и не имел этой проблемы. Я даже развернул это приложение на нескольких серверах БЕЗ балансировки нагрузки, и я не вижу порт, указанный в любом вызове Flex для CFC.

Что касается Flex, он вызывает вызов WSDL с номером порта и CF-кодом? Что-то происходит на балансировщике нагрузки, о котором я не знаю?

ответ

2

Это не проблема Flex, это проблема ColdFusion. По умолчанию WSDL, созданные вне CFC (без дополнительных параметров), генерируют элемент <wsdlsoap:address location>, полученный путем интроспекции. То есть CF-сервер просматривает собственную локальную информацию об экземпляре и создает абсолютный URL-адрес, соответствующий его настройкам ...

... это включает в себя нестандартный порт, который проявится в вашей ситуации - когда сервер ColdFusion находится за балансировщиком нагрузки, который перенаправляет трафик с 80 на другой порт.

Решение: В CF8 или выше, вы можете добавить новый атрибут тега «serviceaddress»:

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

Это заставит CFC, чтобы произвести правильный <wsdlsoap:address location> элемент, когда WSDL запрашивается.

Причина, по которой ваш CF-клиент работает правильно, но клиент Flex не ... заключается в том, что клиент CF не соблюдает местоположение адреса WSDL в XML, но вместо этого использует начальный адрес, для которого он создан заглушки.