2009-09-01 116 views
5

我有一个Silverlight应用程序(在intranet.mydomain.net托管),并在WCF服务(webservices.mydomain.net)Silverlight的WCF服务跨域问题

我需要一个跨站点策略文件?如果是这样,它看起来像只允许从intranet.mydomain.net访问?

回答

4

是的,您需要在服务域(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> 
+0

如何将这项工作,如果我有两个WCF服务? '/ ServiceA/a.svc'和'/ ServiceB/b.svc',我希望ServiceA能够在任何地方向任何人开放,而ServiceB只能在我的Intranet上运行?这可能来自crossdomain文件吗? – Nate 2009-12-07 19:09:18

+1

我编辑了我的答案。 – DaveB 2009-12-07 20:02:04

+0

这将在Safari上工作吗?看起来Safari默认不支持跨域xml-s。当然,这可能并不重要...... – Gyuri 2009-12-07 20:08:20

5

你可能想看看下面的链接了解通过添雅“如何使用跨域策略文件的Silverlight”。

http://silverlight.net/learn/videos/all/how-to-use-cross-domain-policy-files-with-silverlight/

以下是蒂姆·豪雅的博客另外一个页面,你可以通读有例子还有:

http://timheuer.com/blog/archive/2008/04/06/silverlight-cross-domain-policy-file-snippet-intellisense.aspx

alt text

我会考虑写自己的WCF服务与您的Silverlight应用程序一起工作并处理对外部WCF服务的请求。这样你就不会打开任何东西,只允许与受控服务进行通信(尽管你提到的服务可能在你的控制之下)。

当其他服务不在您的手中并可能经常更改时,此方法也很有用。你可以通过你自己的服务来控制它的处理方式,并且永远不需要更新你的Silverlight控件(假设变化不是很剧烈)。