跨域引用Silverlight相關問題解疑
Silverlight開發工具的應用領域比較廣發。不過即使是這樣一款功能強大的工具,在使用的時候同樣也會造成一些問題的產生。比如跨域引用Silverlight時,就會出現一些令人頭疼的問題。跨域引用Silverlight,即將Silverlight包部署在A域下,卻由在B域下的網站引用。其中Silverlight通過HTML.Window調用了腳本方法。#t#
示例代碼
- public partial class Page :
UserControl - {
- public Page()
- {
- InitializeComponent();
- }
- private void Button_Click
(object sender, RoutedEventArgs e) - {
- HtmlPage.Window.Alert("hi");
- }
- }
跨域引用Silverlight異常描述
進入B域頁面,沒有看到Silverlight展現,右鍵點擊相應區域,顯示“Silvelight”,說明Silverlight區域已經被渲染出來。通過HTTP Watch查看,發現Xap包已經被請求并下載下來,但就是沒有展現。
Silverlight正常顯示,但點擊按鈕后,并不彈出對話框。調試發現,在HtmlPage.Window.Alert("hi");拋出異常,異常信息為“已禁用DOM/腳本橋”。
跨域引用Silverlight問題解決
加載卻不展示,是由于在A網站下沒有給Silverlight配置正確的MIME類型。當引用不同域下的Silverlight包,Silverlight Runtime會檢測XAP的HTTP頭中的MIME類型。正確的類型是“application/x-silverlight-app”,如果配為“application/x-silverlight-2”(這似乎是舊版本的MIME配置),同樣不能正常顯示。IIS7由于默認帶有Xap的MIME類型配置,所以不會出現此類問題。
不能正常彈出Alert對話框,但如果改成MessageBox.Show("Click");卻可以正常運行。這是因為需要配置Silverlight以及Host Silverlight的頁面的幾個參數,使得Silverlight中的ManagedCode和頁面中的Javascript和DOM code可以交互。而在同域下,這幾個參數或者是默認配置好的,或者就是干脆無效,所以不需要配置。具體可參考(Security Settings in HTML Bridge),具體到這里的情況,就是要在頁面中配置enableHtmlAccess屬性,使在Silverlight的Manage code里可以操縱外部Dom對象。
Asp.net頁面:
- < asp:Silverlight ID="Xaml1" HtmlAccess="Enabled"
runat="server"Source=http://localhost:2300/
ClientBin/SilverlightApplication.xap
MinimumVersion="2.0.31005.0" Width="100%"
Height="100%" />HTML頁面:- < object data="data:application/x-silverlight-2,"
type="application/x-silverlight-2"
width="80%" height="80%" >- < param name="enableHtmlAccess" value="true" />
- < param name="source" value="http://
localhost:2300/ClientBin/Silverlight
Application.xap"/>- < param name="onerror" value="onSilverlightError" />
- < param name="background" value="white" />
- < param name="minRuntimeVersion"
value="2.0.31005.0" />- < param name="autoUpgrade" value="true" />
- < a href="http://go.microsoft.com/
fwlink/?LinkID=124807" style="text-
decoration: none;">- < img src="http://go.microsoft.com/
fwlink/?LinkId=108181" alt="Get Microsoft
Silverlight" style="border-style: none"/>- < /a>
- < /object>
以上就是我們為大家帶來的跨域引用Silverlight相關問題解決辦法。