1、文章出處:http://www.cnblogs.com/liaohenchen/articles/silverlight-cross-domain.html
今天在做silverlight訪問JSon數據的時候老是出現錯誤,才發現是跨域的問題,因此將這方面的內容整理一些,列了出來
SilverLight 出於對安全性的考慮默認情況下對URL的訪問進行了嚴格的限制,只允許訪問同一子域下的URL資源。
下表列出了Silverlight 2.0 中 URL 訪問規則:
WebClient對象 | Media、images、ASX | XAML 文件、Font 文件 | 流媒體 | |
允許的協議 | HTTP, HTTPS | HTTP, HTTPS, FILE | HTTP, HTTPS, FILE | HTTP |
跨協議訪問 | 不允許 | 不允許 | 不允許 | 不允許來自HTTPS的訪問 |
跨Web域訪問 | 不允許 | 如果不是來自HTTPS則允許 | 不允許 | 允許 |
跨安全區域訪問(Windows) | 不允許 | 不允許 | 不允許 | 不允許 |
跨安全區域訪問(Macintosh) | 不允許 | 允許 | 不允許 | 允許 |
允許重定向 | 同域允許 | 允許 | 同域允許 | 不允許 |
如果WCF與SilverLight Web不是在同一站點,那麼我們就要在被訪問端的根域放上兩個XML文件clientaccesspolicy.xml,crossdomain.xml
如果要通過WebClinet訪問另一站點的資源,那麼需要在被訪問站點放上域訪問策略xml文件,不然在Complete事件裏面的事件參數報告空對象引用。
clientaccesspolicy.xml文件格式如何,切忌最好要將編碼設置爲utf-8,否則極易出錯
<?xml version="1.0" encoding="utf-8"?>
<access-policy>
<cross-domain-access>
<policy>
<allow-from>
<domain uri="*"/>
</allow-from>
<grant-to>
<resource path="/" include-subpaths="true"/>
</grant-to>
</policy>
</cross-domain-access>
</access-policy>
crossdomain.xml文件格式
crossdomain.xml的格式非常簡單,其根節點爲<cross-domain-policy> ,其下包含一個或多個<allow-access-from>節點,<allow-access-from>有一個屬性domain,其值爲允許訪問的域,可以是確切的 IP 地址、一個確切的域或一個通配符域(任何域)。下邊是兩個例子:
程序代碼
<?xml version="1.0"?>
<cross-domain-policy>
<allow-access-from domain="http://www.lishewen.com.cn/" />
<allow-access-from domain="*.lishewen.com.cn" />
<allow-access-from domain="222.217.221.16" />
</cross-domain-policy>
程序代碼
<?xml version="1.0"?>
<cross-domain-policy>
<allow-access-from domain="*" />
</cross-domain-policy>
第二個例子允許任何域的訪問。對於crossdomain.xml文件存放位置,建議將其存放於站點根目錄中!
如:http://bbs.lishewen.com.cn/crossdomain.xml
在這我也弄了個Silverlight的例子來測試
http://silverlight.lishewen.net.cn/SyndicationFeedReader/
關於clientaccesspolicy.xml,crossdomain.xml的具體說明,請大家參看MSDN http://msdn.microsoft.com/en-us/library/cc645032(VS.95).aspx
文章整理資料來源於:http://www.cnblogs.com/format/articles/1282203.html
2、文章出處:http://www.cnblogs.com/akiing/archive/2009/11/17/1604489.html
WCF跨域 這可能是由於試圖以跨域方式訪問服務而又沒有正確的跨域策略,或策略不適用於 SOAP
嘗試向 URI“http://localhost:8001/AccountService.svc”發出請求時出錯。這可能是由於試圖以跨域方式訪問服務而又沒有正確的跨域策略,或策略不適用於 SOAP 服務。您可能需要與該服務的所有者聯繫,以發佈跨域策略文件並確保該文件允許發送 SOAP 相關的 HTTP 標頭。出現此錯誤也可能是由於使用的是 Web 服務代理中的內部類型而沒有使用 InternalsVisibleToAttribute 屬性。有關詳細信息,請參閱內部異常。
解決方法:
一、在WCF項目根目錄下添加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 path="/" include-subpaths="true"/>
</grant-to>
</policy>
</cross-domain-access>
</access-policy>
二、在silverlight項目中添加一箇中介類ServerManager.cs
public class ServerManager
{
private static ServiceWcfClient servicePicture = new ServiceWcfClient();
internal static ServiceWcfClient GetPox()
{
if (servicePicture.State == System.ServiceModel.CommunicationState.Created)
{
servicePicture.Endpoint.Address = new System.ServiceModel.EndpointAddress("http://localhost:52207/ServiceWcf.svc");
return servicePicture;
}
else
{
return servicePicture;
}
}
}
三、實例化實體類的時候一般是這樣:ServiceWcfClient clientWcf = new ServiceWcfClient();
換成:ServiceWcfClient clientWcf = ServerManager.GetPox();