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,crossdomain.xml的具体说明,请大家参看MSDN http://msdn.microsoft.com/en-us/library/cc645032(VS.95).aspx
这几天想用silverlight访问网站的xml文件,以及跨域使用session信息,一直提示安全性错误,搜索了很多,终于解决了。
得在站点根目录添加一个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="/interface"/> </grant-to> </policy> </cross-domain-access> </access-policy>
其中/interface 为需要访问的文件所在的路径,并且这个文件需要放在将要访问的站点根目录。
我看网上很多写的include-subpaths="false"。我试了,貌似不行,也不知道是什么原因。
更多参考资料:
http://silverlightchina.net/html/tips/2009/0916/184.html
http://silverlightchina.net/html/tips/2010/0107/563.html
这个微软详细说明:
http://msdn.microsoft.com/zh-cn/library/cc645032(v=vs.95).aspx