我有一个Silverlight应用程序(在intranet.mydomain.net托管),并在WCF服务(webservices.mydomain.net)Silverlight的WCF服务跨域问题
我需要一个跨站点策略文件?如果是这样,它看起来像只允许从intranet.mydomain.net访问?
我有一个Silverlight应用程序(在intranet.mydomain.net托管),并在WCF服务(webservices.mydomain.net)Silverlight的WCF服务跨域问题
我需要一个跨站点策略文件?如果是这样,它看起来像只允许从intranet.mydomain.net访问?
是的,您需要在服务域(webservices.mydomain.net)的ROOT中有一个clientaccesspolicy.xml文件。
默认情况下,Silverlight支持在同一个域或原始站点上调用Web服务。相同的域意味着呼叫必须使用相同的子域,协议和端口。这是出于安全原因,并防止跨域伪造。
下面是一个例子文件:
<?xml version="1.0" encoding="utf-8" ?>
<access-policy>
<cross-domain-access>
<policy>
<allow-from http-request-headers="*">
<domain uri="http://intranet.mydomain.net"/>
</allow-from>
<grant-to>
<resource path="/" include-subpaths="true"/>
</grant-to>
</policy>
</cross-domain-access>
</access-policy>
这将只允许来自intranet.mydomain.net请求。
编辑
有人问: 这将如何工作,如果我有两个WCF服务? /ServiceA/a.svc和/ServiceB/b.svc,我希望ServiceA能够在任何地方向任何人开放,而ServiceB只能在我的Intranet上运行?
策略文件应该是这样的:
<?xml version="1.0" encoding="utf-8" ?>
<access-policy>
<cross-domain-access>
<policy>
<allow-from http-request-headers="*">
<domain uri="http://*"/>
</allow-from>
<grant-to>
<resource path="/ServiceA/" include-subpaths="true"/>
</grant-to>
</policy>
<policy>
<allow-from http-request-headers="*">
<domain uri="http://intranet.mydomain.net"/>
</allow-from>
<grant-to>
<resource path="/ServiceB/" include-subpaths="true"/>
</grant-to>
</policy>
</cross-domain-access>
</access-policy>
你可能想看看下面的链接了解通过添雅“如何使用跨域策略文件的Silverlight”。
http://silverlight.net/learn/videos/all/how-to-use-cross-domain-policy-files-with-silverlight/
以下是蒂姆·豪雅的博客另外一个页面,你可以通读有例子还有:
我会考虑写自己的WCF服务与您的Silverlight应用程序一起工作并处理对外部WCF服务的请求。这样你就不会打开任何东西,只允许与受控服务进行通信(尽管你提到的服务可能在你的控制之下)。
当其他服务不在您的手中并可能经常更改时,此方法也很有用。你可以通过你自己的服务来控制它的处理方式,并且永远不需要更新你的Silverlight控件(假设变化不是很剧烈)。
如何将这项工作,如果我有两个WCF服务? '/ ServiceA/a.svc'和'/ ServiceB/b.svc',我希望ServiceA能够在任何地方向任何人开放,而ServiceB只能在我的Intranet上运行?这可能来自crossdomain文件吗? – Nate 2009-12-07 19:09:18
我编辑了我的答案。 – DaveB 2009-12-07 20:02:04
这将在Safari上工作吗?看起来Safari默认不支持跨域xml-s。当然,这可能并不重要...... – Gyuri 2009-12-07 20:08:20