HTML Bridge не работает с междоменным Silverlight XAP - PullRequest
1 голос
/ 27 января 2012

У меня есть сложное приложение Silverlight, которое довольно широко использует функции моста HTML (в обоих направлениях).Приложение работает нормально, когда страница хостинга находится в том же домене, что и источник XAP.К сожалению, я не могу заставить функционировать мост HTML, когда страница хостинга находится в другом домене.

Теперь я знаю различные приемы, обычно необходимые для того, чтобы это работало, т. Е. Все, что здесь задокументировано: http://msdn.microsoft.com/en-us/library/cc645023(VS.95).aspx. Я даже собрал свое собственное упрощенное междоменное репро, которое, как я надеялся, высветило бы проблему, но, к сожалению, мое «репро» работает, то есть JS-> SL и SL-> JSфункциональность в нем прекрасно работает, даже если XAP размещен в другом домене.

Вот что я пытался пока сузить, чтобы решить проблему:

В моем производственном решении (гдеУ меня возникла проблема):

  1. Подтверждено, что для «EnableHtmlAccess» установлено значение true в теге <object>.
  2. Подтверждено, что для «ExternalCallersFromCrossDomain» установлено значение «ScriptableOnly»в файле AppManifest.xml.

В моем решении для воспроизведения (где я не могу решить эту проблему):

  1. Добавлено несколько библиотек с несколькими зарегистрированнымиобъекты criptable.
  2. Добавлены события к зарегистрированным объектам.

На обоих:

  1. Пробовал с помощью статического тега <object> и с динамическисоздал тег <object> (через Silverlight.js).
  2. Пробовал с указанием и без указания обработчиков для onSourceDownloadProgressChanged, onSourceDownloadComplete, onError и onLoad.
  3. Пробовал с и без заставки.

У меня как будто заканчиваются идеи.У кого-нибудь есть предложения по устранению неполадок?

1 Ответ

0 голосов
/ 28 января 2012

Ну, до сих пор я не смог отследить точную разницу между рабочей и нерабочей версиями.Но я нашел обходной путь, которого достаточно для моих нужд.Оказывается, только функциональность JS-> SL была нарушена;любые звонки из SL-> JS все еще работали.Так что я сделал, чтобы зарегистрировать скриптовые объекты SL из Silverlight.В своем управляющем классе JavaScript я создал функцию с уникальным именем и зарегистрировал ее в объекте window:

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

И затем я передаю имя функции как часть InitParams приложения Silverlight.:

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();

Вроде хак, но это работает.Пока достаточно близко.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...