HTML Bridge不使用跨域Silverlight XAP

时间:2012-01-27 03:53:27

标签: silverlight cross-browser

我有一个复杂的Silverlight应用程序,它非常广泛地使用HTML桥接功能(在两个方向上)。当托管页面来自与XAP源相同的域时,应用程序运行正常。不幸的是,当托管页面位于不同的域时,我无法使HTML桥接功能正常工作。

现在,我知道通常需要的各种技巧,即这里记录的所有内容:http://msdn.microsoft.com/en-us/library/cc645023(VS.95).aspx。我甚至整理了我自己的简化跨域repro,我希望能突出问题,但不幸的是,我的“repro”工作,即JS-> SL和SL-> JS功能都可以正常工作它,即使XAP托管在不同的域上。

以下是我迄今为止尝试缩小问题的范围:

在我的生产解决方案上(我遇到问题):

  1. 确认<object>代码中的“EnableHtmlAccess”设置为true。
  2. 确认AppManifest.xml文件中的“ExternalCallersFromCrossDomain”设置为“ScriptableOnly”。
  3. 在我的repro解决方案上(我无法解决问题):

    1. 添加了多个具有多个已注册脚本化对象的库。
    2. 向已注册的对象添加了事件。
    3. 同时:

      1. 使用静态<object>标记和动态创建的<object>标记(通过Silverlight.js)进行尝试。
      2. 使用和不指定onSourceDownloadProgressChanged,onSourceDownloadComplete,onError和onLoad的处理程序来尝试。
      3. 尝试使用和不使用闪屏。
      4. 我有点想法。有人对其他故障排除步骤有任何建议吗?

1 个答案:

答案 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,但它确实有效。现在足够近了。