2012-01-27 56 views
1

我有一個複雜的Silverlight應用程序,它非常廣泛地使用HTML橋接功能(在兩個方向上)。當託管頁面來自與XAP源相同的域時,該應用運行良好。不幸的是,當託管頁面位於不同的域時,我無法使HTML橋接功能正常工作。HTML Bridge無法與跨域Silverlight XAP

現在,我知道通常需要這些工作的各種技巧,例如:http://msdn.microsoft.com/en-us/library/cc645023(VS.95).aspx。我甚至把我自己的簡化的跨域repro放在一起,我希望能夠突出這個問題,但不幸的是,我的「repro」工作,即JS-> SL和SL-> JS功能都可以正常工作,即使XAP託管在不同的域上。

這是我到目前爲止已經試過以縮小問題:

在我的生產解決方案(在那裏我遇到的問題):

  1. 證實,「EnableHtmlAccess」設置爲在<object>標記中爲true。
  2. 確認AppManifest.xml文件中的「ExternalCallersFromCrossDomain」設置爲「ScriptableOnly」。

在我的攝製解決方案(在這裏我不能讓它有問題):

  1. 添加多個多個庫登記的可編程對象。
  2. 向註冊對象添加事件。

在兩個:

  1. 具有靜態<object>標籤,並用(通過Silverlight.js的)動態創建的<object>標籤嘗試過。
  2. 試過它,沒有爲onSourceDownloadProgressChanged,onSourceDownloadComplete,onError和onLoad指定處理程序。
  3. 嘗試過,沒有閃屏。

我有點不知所措。任何人有任何其他疑難解答步驟的建議?

回答

0

那麼,到目前爲止,我還沒有能夠追蹤工作和​​非工作版本之間的精確區別。但是我想出了一個解決方案,足以滿足我的需求。事實證明,只有JS-> SL功能被破壞;來自SL-> JS的任何呼叫仍然有效。所以我做的是在Silverlight中註冊可編寫腳本的SL對象。在我的控制JavaScript類,我創建了一個獨特的名字的功能,並與窗口對象註冊它:

var mLoadingController; 
var mAppId = 'alantaClient_' + Alanta.makeId(); 
var mSetLoadingControllerId = mAppId + '_SetLoadingController'; 
window[mSetLoadingControllerId] = function (value) { 
    mLoadingController = value; 
    onLoad(); 
}; 

然後我在函數的名稱通過爲Silverlight應用程序的initParams在的一部分:

var initParams = 'setLoadingControllerId=' + mSetLoadingControllerId; 
Silverlight.createObject(mSource, mAppHost, mAppId, params, events, initParams); 

然後我調用註冊功能從Silverlight內,像這樣:

// Do everything necessary to make the LoadingController scriptable. 
HtmlPage.RegisterScriptableObject("LoadingController", LoadingController.Instance); 
string setLoadingControllerId; 
if (e.InitParams.TryGetValue(LoaderConstants.SetLoadingControllerIdReference, out setLoadingControllerId)) 
{ 
    HtmlPage.Window.Invoke(setLoadingControllerId, LoadingController.Instance); 
} 

,然後我可以從JS調用它,就像這樣:

mLoadingController.GoToRoom(); 

有點hacky,但它的工作原理。現在足夠接近。