2012-01-27 8 views
1

HTMLブリッジ機能をかなり広範囲(双方向)で使用する複雑なSilverlightアプリケーションがあります。ホスティングページがXAPソースと同じドメインにある場合、アプリケーションはうまく動作します。残念ながら、ホスティングページが別のドメインにある場合、HTMLブリッジ機能を動作させることはできません。 http://msdn.microsoft.com/en-us/library/cc645023(VS.95).aspxHTMLブリッジはクロスドメインSilverlight XAPで動作しません

は今、私は通常、これは、ここでは説明しています、すなわち、すべてを動作させるために必要な様々なトリックを知っています。残念ながら、私の "repro"の仕事、つまりJS-> SLとSL-> JSの両方の機能がうまく機能しているのですが、私はこの問題を浮き彫りにしたいと思っていました。 XAPが別のドメインでホストされている場合でも同様です。私の生産ソリューションに

(私は問題を抱えている):

  1. 「EnableHtmlAccessが」に設定されていることを確認ここで

    は、私は、問題を絞り込むために、これまでに試したものです<object>タグに該当します。
  2. "ExternalCallersFromCrossDomain"がAppManifest.xmlファイルの "ScriptableOnly"に設定されていることを確認しました。私のREPROソリューションに

(ここで、私はそれが問題を持って取得することはできません):

  1. は、複数の登録スクリプト可能なオブジェクトで複数のライブラリを追加しました。
  2. 登録されたオブジェクトにイベントを追加しました。
  3. の両方で

に:

  1. は静的<object>タグとし、(Silverlight.jsを介して)動的に作成<object>タグとそれを試してみました。
  2. はとしてonSourceDownloadProgressChanged、onSourceDownloadComplete、のonError、およびオンロード用のハンドラを指定せずにそれを試してみました。
  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(); 

これはハッキーですが動作します。今は十分に近い。

関連する問題