2011-09-13 43 views
8

我監視(並登錄到服務器)我們的Flash遊戲中的大多數用戶錯誤。我經常看到有關嘗試向跨域URL(通常是Facebook Graph API)發出請求的安全錯誤。 99%的玩家可以不用擔心這些圖形API調用。加載crossdomain.xml策略文件時如何處理網絡故障?

我認爲正在進行的是客戶端發出請求,但未能加載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

這是一個似乎可行的解決方案。

假設你使用的是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

我的測試顯示它每10秒左右重試一次,所以我猜應該可以顯示一條錯誤消息,並在幾秒鐘後重試。