SilverLight跨域訪問及其常用的幾種解決方法

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

               http://blog.lishewen.com.cn/post/2008/06/e4bdbfe794a8crossdomainxmle8aea9Silverlighte58fafe4bba5e8b7a8e59f9fe4bca0e8be93e695b0e68dae.aspx

 

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();

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章