我有一个复杂的Silverlight应用程序,它非常广泛地使用HTML桥接功能(在两个方向上)。当托管页面来自与XAP源相同的域时,应用程序运行正常。不幸的是,当托管页面位于不同的域时,我无法使HTML桥接功能正常工作。
现在,我知道通常需要的各种技巧,即这里记录的所有内容:http://msdn.microsoft.com/en-us/library/cc645023(VS.95).aspx。我甚至整理了我自己的简化跨域repro,我希望能突出问题,但不幸的是,我的“repro”工作,即JS-> SL和SL-> JS功能都可以正常工作它,即使XAP托管在不同的域上。
以下是我迄今为止尝试缩小问题的范围:
在我的生产解决方案上(我遇到问题):
<object>
代码中的“EnableHtmlAccess”设置为true。在我的repro解决方案上(我无法解决问题):
同时:
<object>
标记和动态创建的<object>
标记(通过Silverlight.js)进行尝试。我有点想法。有人对其他故障排除步骤有任何建议吗?
答案 0 :(得分:0)
好吧,到目前为止,我还无法找到工作版本和非工作版本之间的确切差异。但我想出了一个足以满足我需求的解决方法。事实证明,只有JS-&gt; SL功能被破坏了;任何来自SL-&gt; JS的电话仍然有效。所以我做的是从Silverlight中注册可编写脚本的SL对象。在我控制的JavaScript类中,我创建了一个具有唯一名称的函数,并将其注册到window对象:
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,但它确实有效。现在足够近了。