在silverlight開發的過程中不免要遇到跨域的問題,在這裡以跨域調用Webservice為例子來分析一下跨域的問題。
 
先介紹一下我的測試專案,我用flash和silverlight一同來調用一個webservice,一個flash用戶端,一個silverlight用戶端,一個web專案來host flash和silverlight,再加上一個webservice端。
flash發佈到web專案的swf資料夾下。 web專案中的clienttestpage.html中的sl和flash來調用webservice。

769834061305475306  
 
具體如何調用webservice我這裡就略去了。
我的webservice裡有一個方法
[WebMethod]public string SayHello(string name) { return "Hello " + name;}
 
webservice
706783666522141096  

 
Html Host頁面

2569866537369463254  

 
--------------------------------------------------------------------------------
 
這裡先用silverlight來調用,在輸入使用者名都點擊invoke按鈕看看發聲了什麼。
在firefox中打開firebug的網路監視器
667658644758654629  

 
這裡發現他先去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的請求,所以要加上紅色部分。
再次調用看看是什麼情況
1849290596990649475  
 
請求到了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>
 
再次調用
1350235463282133974  
 
在沒有找到clientaccesspolicy.xml的情況下,去請求crossdomain.xml檔,得到回應後就正式請求webservice檔,並且也得到了傳回值。
 
--------------------------------------------------------------------------------
 
接下來看flash 這裡用as2.0做的。

1463106928943505713  
他一開始直接就請求了crossdomain.xml,並沒有去請求clientaccesspolicy.xml。
 
再輸入使用者名後,直接向webservice post資料,得到傳回值。
 
好接下來看看as3的flash又會如何。
1142225455493080078  

 
機制有些改變,一開始沒去請求xml。
 
輸入使用者名,調用

2737344148512083102  

 
再看看沒有找到xml的情況

2123728699283780113  

 
--------------------------------------------------------------------------------
 
好了在看看網上我搜索到的一些說法。
 
「出於安全考慮,FlashPlayer預設的安全設置是不允許進行跨域操作的。即便是同一個網站,如果用不同的方式訪問,也會被FlashPlayer認為是跨域操作。
為解決Flash/Flex系統中的跨域問題,提出了crossdomain.xml跨域策略檔。有了它,就可以解決跨域問題。
 
「SilverLight要實現跨域訪問,必須在服務端被訪問域的直接功能變數名稱下,配置 clientaccesspolicy.xml( 或 crossdomain.xml)檔,即可以訪問 HTTP://{domainName}/clientaccesspolicy.xml。 
 
--------------------------------------------------------------------------------
 
提出問題
關於crossdomain.xml 和 clientaccesspolicy.xml 的區別。
1、這兩個檔真的是可以任選其一嗎?
 
2、這兩個檔分別需要被放在服務端還是用戶端?
 
3、不管後臺服務部署在IIS還是其它環境中,這兩個檔都可以使用嗎?




 
解答
 
1.silverlight在使用中可以任選其一,建議直接使用clientaccesspolicy.xml。flash只能使用crossdomain.xml。
 
2.都是必須在服務端被訪問域的直接功能變數名稱下 。
 
3.都可以使用
 
arrow
arrow
    全站熱搜

    戮克 發表在 痞客邦 留言(0) 人氣()