分析Silverlight跨域調用
在silverlight開發的過程中不免要遇到跨域的問題,在這裡以跨域調用Webservice為例子來分析一下跨域的問題。
先介紹一下我的測試項目,我用flash和silverlight一同來調用一個webservice,一個flash用戶端,一個silverlight用戶端,一個web項目來host flash和silverlight,再加上一個webservice端。
flash釋出到web項目的swf檔案夾下。 web項目中的clienttestpage.html中的sl和flash來調用webservice。
具體如何調用webservice我這裡就略去了。
我的webservice裡有一個方法
[WebMethod]
public string SayHello(string name) {
return "Hello " + name;
}
webservice
Html Host頁面
這裡先用silverlight來調用,在輸入使用者名都點選invoke按鈕看看發聲了什麼。
在firefox中打開firebug的網絡螢幕
這裡發現他先去webservice所在的域的根目錄下請求一個 clientaccesspolicy.xml 的檔案,在沒有到後又去請求一個crossdomain.xml的檔案,同樣也是沒有找到,傳回404。
好,這裡我在webservice域根下放入一個clientaccesspolicy.xml
clientaccesspolicy.xml
代碼
<?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的請求,是以要加上紅色部分。
再次調用看看是什麼情況
請求到了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>
再次調用
在沒有找到clientaccesspolicy.xml的情況下,去請求crossdomain.xml檔案,得到響應後就正式請求webservice檔案,并且也得到了傳回值。
接下來看flash 這裡用as2.0做的。
他一開始直接就請求了crossdomain.xml,并沒有去請求clientaccesspolicy.xml。
再輸入使用者名後,直接向webservice post資料,得到傳回值。
好接下來看看as3的flash又會如何。
機制有些改變,一開始沒去請求xml。
輸入使用者名,調用
再看看沒有找到xml的情況
好了在看看網上我搜尋到的一些說法。
“出于安全考慮,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>