Что делать с сетевыми сбоями при загрузке файла политики crossdomain.xml? - PullRequest
8 голосов
/ 13 сентября 2011

Я отслеживаю (и регистрирую на сервере) большинство пользовательских ошибок в нашей флеш игре.Довольно часто я вижу ошибки безопасности, связанные с попыткой отправки запросов на междоменный URL-адрес (обычно это API Graph Facebook).99% наших игроков могут делать эти вызовы API графа без проблем.

Я думаю, что происходит, когда клиент делает запрос, но не может загрузить файл crossdomain.xml.Я не совсем знаю, как AS3 справляется с этим в случае сбоя загрузки файла политики междоменного домена ... будет ли он повторяться для каждого URLRequest, пока не удастся его загрузить, или он просто сдается навсегда?Какова «лучшая практика» в ответ на ошибку безопасности, подобную этой?

Я предварительно загружаю файлы политики Facebook один раз, заранее, например:

// allow images to be loaded from facebook and facebook's cdn's.
Security.loadPolicyFile( "http://www.facebook.com/crossdomain.xml" );
Security.loadPolicyFile( "https://api.facebook.com/crossdomain.xml" );
Security.loadPolicyFile( "https://graph.facebook.com/crossdomain.xml" );
Security.loadPolicyFile( "http://profile.ak.fbcdn.net/crossdomain.xml" );

, затем ятакже сделать флэш-проверку файла политики снова при создании URLRequest.

Ответы [ 2 ]

2 голосов
/ 31 октября 2011

Вот решение, которое, кажется, работает.

Если вы используете URLLoader для чтения данных с одного из доменов, в котором есть файл crossdomain.xml, и вы вызываете loadPolicyFile для предварительной загрузки файла crossdomain.xml, есть вероятность, что загрузка не удастся, либо из-за проблем с сетевым подключением или из-за сбоя сервера, или из-за солнечных вспышек. Когда вы устанавливаете URLLoader, вы можете добавить прослушиватель событий для SecurityErrorEvent.SECURITY_ERROR. В четном слушателе вы можете попробовать загрузить файл политики снова. Файлы политики кэшируются, даже если они не загружаются (спасибо Adobe), поэтому вам придется добавить параметр запроса очистки кэша.

Вот простой пример того, как это будет работать:

public function loadMyFriends():void {
  var urlLoader:URLLoader = new URLLoader();
  urlLoader.addEventListener(
    SecurityErrorEvent.SECURITY_ERROR, handleSecurityError);
  urlLoader.load(new URLRequest('https://graph.facebook.com/me/friends'));
}

private function handleSecurityError(event:Event):void {
  Security.loadPolicyFile(
    "https://graph.facebook.com/crossdomain.xml?__cb"=Math.random());
  loadMyFriends();
}

На практике вы, возможно, захотите ограничить количество повторных попыток и, возможно, сделать экспоненциальный откат, если это действительно проблема с сетевым подключением, а не просто мертвый сервер, который неправильно обрабатывается балансировщиком нагрузки.

0 голосов
/ 03 октября 2011

Мои тесты показали, что он повторяется примерно каждые 10 секунд или около того, поэтому я предполагаю, что должна быть возможность показать сообщение об ошибке и повторить попытку через несколько секунд.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...