Silverlight WCF服务跨域问题

时间:2009-09-01 18:48:47

标签: silverlight web-services service cross-domain

我有一个silverlight应用程序(在intranet.mydomain.net上托管)和一个WCF服务在(webservices.mydomain.net)

我是否需要跨站点策略文件?如果是这样,只允许从intranet.mydomain.net访问它会是什么样?

2 个答案:

答案 0 :(得分:5)

您可能希望通过 Tim Heuer 查看以下关于如何使用Silverlight的跨域策略文件的链接。

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

以下是Tim Heuer博客的另一页,您可以阅读其中也有例子:

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

alt text

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

当其他服务无法使用并且可能经常更改时,此方法也很有用。您可以通过自己的服务控制如何处理它,并且永远不需要更新您的silverlight控件(假设更改不是很激烈)。

答案 1 :(得分: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只能在我的内部网上工作?

您的政策文件如下所示:

<?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>