加载crossdomain.xml策略文件时如何处理网络故障?

时间:2011-09-13 08:17:53

标签: flash actionscript-3 facebook security facebook-graph-api

我在我们的Flash游戏中监控(并记录到服务器)大多数用户错误。我经常看到与尝试向跨域URL(通常是Facebook Graph API)发出请求相关的安全性错误。 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 个答案:

答案 0 :(得分:2)

这是一个似乎有效的解决方案。

假设您使用URLLoader从具有crossdomain.xml文件的域之一读取数据并且您正在调用loadPolicyFile来预加载crossdomain.xml,则有可能是加载无论是来自网络连接问题,还是来自服务器关闭,或来自太阳耀斑,都将失败。设置URLLoader后,您可以为SecurityErrorEvent.SECURITY_ERROR添加事件监听器。在even listener中,您可以尝试再次加载策略文件。虽然策略文件已加载缓存,即使它们无法加载(感谢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();
}

在实践中,您可能希望限制重试次数,如果它确实是网络连接问题,可能会执行指数退避,而不仅仅是负载均衡器未正确处理的死服务器。

答案 1 :(得分:0)

我的测试表明它每10秒钟重试一次,所以我猜应该可以显示错误信息,并在几秒钟后重试。