Flash-приложение загружает файл crossdomain.xml с сервера приложений? - PullRequest
0 голосов
/ 02 августа 2011

Обзор

Я пишу веб-приложение с использованием трехуровневой архитектуры.У меня есть три сервера Amazon EC2 Ubuntu.Первый сервер обрабатывает презентацию приложения и включает мой основной файл флэш-памяти.Второй экземпляр EC2 представляет мой сервер приложений.Он содержит файлы AMFPHP и соответствующие веб-сервисы.Наконец, третий экземпляр обрабатывает персистентность и использует базу данных MySQL.На серверах приложений presentation и работает веб-сервер apache.Я создал группы безопасности, специфичные для каждого уровня, так что уровень представления будет принимать весь входящий трафик через порт 80, тогда как уровень приложения будет принимать только входящий трафик с сервера представления.Это должно позволить любому запрашивать мое веб-приложение с сервера презентаций, но запрещать доступ к веб-службам на моем сервере приложений.

Проблема

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

Пример:

Security.loadPolicyFile( "http://<EC2 internal IP or public DNS>/crossdomain.xml" );
gw = new NetConnection();
gw.objectEncoding = ObjectEncoding.AMF0;

// connect to the AMFPHP gateway so we can use the services
gw.connect( "http://<EC2 internal IP or public DNS>/gateway.php" );
res = new Responder( onResult, onFault );
gw.call( "Service.test", res );

Расследование

Мне показалось странным, что я не получил ответа, поэтому я решил попробовать несколько вещей: 1. Я подключился к своему уровню презентации через ssh и попытался использовать lynx для подключения к gateway.php моего сервера приложений.Я смог подключиться без проблем.2. Я использовал окно инструментов разработчика Chrome для наблюдения за сетевым трафиком при загрузке моего сайта.Я обнаружил, что он пытается загрузить файл crossdomain.xml (который находится в корне моего веб-сервера [/ var / www] на уровне приложения) с помощью запроса GET;но, как ни странно, время истекает и терпит неудачу.Это где я запутался.Почему я могу использовать Lynx на той же машине для подключения к веб-серверу на уровне приложений, но приложение Flash не может получить доступ к одному и тому же файлу?

Другая полезная информация

Во время выполнения некоторых тестов я решил открыть брандмауэр экземпляра сервера приложений, чтобы он мог получать запросы http с моего IP.Как только я это сделал, приложение, размещенное на уровне презентации, сразу же начало работать (получил ответ от веб-службы)!Однако это означает, что я должен был бы заставить свой уровень приложений принимать запросы http из Интернета, чтобы работать, а это не то, что я хочу делать.Я не понимаю, почему внесение этого изменения позволило бы приложению получить файл crossdomain.xml.Если группа безопасности сервера приложений настроена на прием входящих http-запросов от группы безопасности презентации, у нее не должно возникнуть проблем с получением файла crossdomain.xml, находящегося в корне веб-сервера сервера приложений, верно?

Я потратил больше времени, чем хотел бы изучить этот вопрос.Я действительно хотел бы установить для своего приложения трехуровневую среду, в которой приложение флэш-памяти сможет отправлять запросы веб-служб на уровень моего приложения.Самым запутанным моментом в этом является тот факт, что когда я добавляю IP-адрес моего компьютера в брандмауэр сервера приложений, кажется, что все волшебным образом работает, как и предполагалось.Пожалуйста, поправьте меня, если я неправильно настраиваю свое приложение.Я основываю свою архитектуру на следующем: http://media.amazonwebservices.com/AWS_Web_Hosting_Best_Practices.pdf

Спасибо за вашу помощь!

С уважением,

Будет

1 Ответ

0 голосов
/ 04 августа 2011

Если все ваши серверы находятся в разных доменах, вам нужно загрузить файл crossdomain.xml с сервера, с которого вы запрашиваете данные / файлы.



Поэтому, если ваш swf находится на сервере A и вам нужны данные с сервера b, вам нужно загрузить файл политики на сервер b

// there is no need to reference the crossdomain.xml.
Security.loadPolicyFile( "http://serverBdomainname.com" )

// or for testing purposes you can use local address but this will not work over the web
// just code in the IP of the server if your machine is on the same network
Security.loadPolicyFile( "192.168.0.111" )

Также вы можете убедиться, что ваш crossdomain.xml доступен через Интернет или откройте его в браузере.
http://serverBdomainname.com/crossdomain.xml

...