最近撰寫Silverlight應用程式時常需要跨網域存取資料,先前在點部落的章立民老師、Kiwi等有介紹過,小弟今天也來小試一下身手,順便記錄下來給也是剛接觸,有需要的人可以參考使用。一般來說,什麼是跨網域呢?一般來說可分為三類
最近撰寫Silverlight應用程式時常需要跨網域存取資料,先前在點部落的章立民老師、Kiwi等有介紹過,小弟今天也來小試一下身手,順便記錄下來給也是剛接觸,有需要的人可以參考使用。一般來說,什麼是跨網域呢?一般來說可分為三類:
- 從HTTP存取HTTPS,或反過來者
- 存取不同的主機,如:http://www.domain.com 要存取 http://www.yahoo.com.tw
- 存取不同Port,如:http://computerName 存取 http://computerName:6000/
舉凡來說這些都是跨網域的存取,所以基於HTTP通訊安全,避免有心人士跨網域的進行DoS等類似的攻擊,Silverlight預設只可以存取本身下載XAP的Domain Name下的網域進行資料的存取,這包含了您在Silverlight的應用程式裡使用HttpWebRequest 或 WebClient等物件對其他網站的存取都還括在內,其實.NET基本上將System.Net 下的命名空間都需以跨網域原則來限制其存取的範圍。
要在本機模擬此情況很簡單,因為Visual Studio 所提供的應用程式發開伺服器一定是使用80以外的其他Post,所以只要把資料來源的網站佈署到IIS中,用戶端就放置Visual Studio 即可。因此沒有此檔案設定的主機,直接存取就會得到如下的錯誤訊息:
所以要使該網域可以接受某些網段進行資料的存取必須在提供資料的主機下的根目錄放置跨網域原則檔 (clientaccesspolicy.xml),而通常只要在提供資料的網域主機的根下面提供一個如下內容的XML檔案 (clientaccesspolicy.xml),重要的是,(必須放置在您網站的根,如 c:\Inetpub\wwwroot\ 的下面,不是您的Web Site的根下面),這也是筆者首次接觸時容易搞錯的。
而假設我要讓http://localhost:6000/ 下的主機可以進行存取 (筆者將Visual Studio 的WEB專案的通訊Port設為6000),此跨網域原則檔內容應該會是如下即可:
1: <?xml version="1.0" encoding="utf-8"?>
2: <access-policy>
3: <cross-domain-access>
4: <policy>
5: <allow-from http-request-headers="SOAPAction">
6: <domain uri="http://localhost:6000/"/>
7: </allow-from>
8: <grant-to>
9: <resource path="/" include-subpaths="true"/>
10: </grant-to>
11: </policy>
12: </cross-domain-access>
13: </access-policy>
如上設定中,<domain> 標籤中的uri屬性可以設為 "*",不過筆者不太建議如此設定,因為測試的結果所有的什麼阿貓、阿狗的主機,不管什麼port下面的都可以存取這個資料來源。
而筆者測試當使用HttpWebRequest存取資料時,沒有跨網域原則檔時出現的為 SecurityException 錯誤,如下圖:
如上!給初次使用的您一個簡單的參考。
謝謝各位。
簽名:
學習是一趟奇妙的旅程
這當中,有辛苦、有心酸、也有成果。有時也會有瓶頸。要能夠繼續勇往直前就必須保有一顆最熱誠的心。
軟體開發之路(FB 社團):https://www.facebook.com/groups/361804473860062/
Gelis 程式設計訓練營(粉絲團):https://www.facebook.com/gelis.dev.learning/
如果文章對您有用,幫我點一下讚,或是點一下『我要推薦』,這會讓我更有動力的為各位讀者撰寫下一篇文章。
非常謝謝各位的支持與愛護,小弟在此位各位說聲謝謝!!! ^_^