天天看點

分析Silverlight跨域調用

分析Silverlight跨域調用

在silverlight開發的過程中不免要遇到跨域的問題,在這裡以跨域調用Webservice為例子來分析一下跨域的問題。

先介紹一下我的測試項目,我用flash和silverlight一同來調用一個webservice,一個flash用戶端,一個silverlight用戶端,一個web項目來host flash和silverlight,再加上一個webservice端。

flash釋出到web項目的swf檔案夾下。  web項目中的clienttestpage.html中的sl和flash來調用webservice。

分析Silverlight跨域調用

 具體如何調用webservice我這裡就略去了。

我的webservice裡有一個方法

[WebMethod]

public string SayHello(string name) {

return "Hello " + name;

}

webservice

分析Silverlight跨域調用

Html Host頁面

分析Silverlight跨域調用

這裡先用silverlight來調用,在輸入使用者名都點選invoke按鈕看看發聲了什麼。

在firefox中打開firebug的網絡螢幕

分析Silverlight跨域調用

 這裡發現他先去webservice所在的域的根目錄下請求一個 clientaccesspolicy.xml 的檔案,在沒有到後又去請求一個crossdomain.xml的檔案,同樣也是沒有找到,傳回404。

好,這裡我在webservice域根下放入一個clientaccesspolicy.xml 

clientaccesspolicy.xml

分析Silverlight跨域調用
分析Silverlight跨域調用

代碼

<?xml version="1.0" encoding="utf-8" ?>

<access-policy>

<cross-domain-access>

<policy>

<allow-from http-request-headers="*">

<domain uri="*"/>

</allow-from>

<grant-to>

<resource include-subpaths="true" path="/"/>

</grant-to>

</policy>

</cross-domain-access>

</access-policy>

因為webservice有requestheaders的請求,是以要加上紅色部分。

再次調用看看是什麼情況

分析Silverlight跨域調用

請求到了clientaccesspolicy.xml 後就去真正請求webservice檔案了。  并且得到了傳回值。

接下來,去掉clientaccesspolicy.xml,加入crossdomain.xml

crossdomain.xml

<?xml version="1.0"?>

<cross-domain-policy>

<allow-access-from domain="*"/>

<allow-http-request-headers-from domain="*" headers="*"/>

</cross-domain-policy>

再次調用

分析Silverlight跨域調用

在沒有找到clientaccesspolicy.xml的情況下,去請求crossdomain.xml檔案,得到響應後就正式請求webservice檔案,并且也得到了傳回值。

接下來看flash  這裡用as2.0做的。 

分析Silverlight跨域調用

他一開始直接就請求了crossdomain.xml,并沒有去請求clientaccesspolicy.xml。

分析Silverlight跨域調用

再輸入使用者名後,直接向webservice post資料,得到傳回值。

好接下來看看as3的flash又會如何。

分析Silverlight跨域調用

機制有些改變,一開始沒去請求xml。

輸入使用者名,調用

分析Silverlight跨域調用

再看看沒有找到xml的情況

分析Silverlight跨域調用

好了在看看網上我搜尋到的一些說法。

“出于安全考慮,FlashPlayer預設的安全設定是不允許進行跨域操作的。即便是同一個網站,如果用不同的方式通路,也會被FlashPlayer認為是跨域操作。

為解決Flash/Flex系統中的跨域問題,提出了crossdomain.xml跨域政策檔案。有了它,就可以解決跨域問題。”

“SilverLight要實作跨域通路,必須在服務端被通路域的直接域名下,配置 clientaccesspolicy.xml( 或 crossdomain.xml)檔案,即可以通路 http://{domainName}/clientaccesspolicy.xml。 ”

<b>提出問題</b>

 關于crossdomain.xml 和 clientaccesspolicy.xml 的差別。

1、這兩個檔案真的是可以任選其一嗎?

2、這兩個檔案分别需要被放在服務端還是用戶端?

3、不管背景服務部署在IIS還是其它環境中,這兩個檔案都可以使用嗎?

<b>解答</b>

1.silverlight在使用中可以任選其一,建議直接使用clientaccesspolicy.xml。flash隻能使用crossdomain.xml。

2.都是必須在服務端被通路域的直接域名下  。

3.都可以使用

參考資料:

<a href="http://social.microsoft.com/Forums/de-DE/silverlightzhchs/thread/1be30f6c-c4bc-43e3-88a8-8c43951b152b">http://social.microsoft.com/Forums/de-DE/silverlightzhchs/thread/1be30f6c-c4bc-43e3-88a8-8c43951b152b</a>

<a href="http://silverlight.net/learn/videos/all/how-to-use-cross-domain-policy-files-with-silverlight/">http://silverlight.net/learn/videos/all/how-to-use-cross-domain-policy-files-with-silverlight/</a>

下一篇: AVL樹