【问题标题】:HTML Bridge not working with cross-domain Silverlight XAPHTML 桥不适用于跨域 Silverlight XAP
【发布时间】:2012-01-27 03:53:26
【问题描述】:

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

现在,我知道了正常运行所需的各种技巧,即此处记录的所有内容:http://msdn.microsoft.com/en-us/library/cc645023(VS.95).aspx。我什至把我自己的简化跨域复制放在一起,希望能突出问题,但不幸的是,我的“复制”有效,即 JS->SL 和 SL->JS 功能都可以正常工作,即使 XAP 托管在不同的域中。

这是我迄今为止尝试缩小问题范围的方法:

关于我的生产解决方案(我遇到问题的地方):

  1. 确认<object>标签中的“EnableHtmlAccess”设置为true。
  2. 确认 AppManifest.xml 文件中的“ExternalCallersFromCrossDomain”设置为“ScriptableOnly”。

关于我的重现解决方案(我无法解决问题):

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

在两个方面:

  1. 尝试使用静态 <object> 标记和动态创建的 <object> 标记(通过 Silverlight.js)。
  2. 在为 onSourceDownloadProgressChanged、onSourceDownloadComplete、onError 和 onLoad 指定和不指定处理程序的情况下进行了尝试。
  3. 在有和没有启动画面的情况下都试过了。

我有点想不通了。有人对其他故障排除步骤有任何建议吗?

【问题讨论】:

    标签: silverlight cross-browser


    【解决方案1】:

    嗯,到目前为止,我还无法找到工作版本和非工作版本之间的确切区别。但我想出了一个足以满足我需求的解决方法。事实证明,只有 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,但它确实有效。现在已经足够接近了。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-07-04
      • 2014-12-30
      • 2014-09-08
      • 2013-02-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-10-19
      相关资源
      最近更新 更多