Silverlight 到 WCF 跨域异常,但正在成功读取 clientaccesspolicy.xml

Posted

技术标签:

【中文标题】Silverlight 到 WCF 跨域异常,但正在成功读取 clientaccesspolicy.xml【英文标题】:Silverlight-to-WCF cross-domain exception, but clientaccesspolicy.xml is being read successfully 【发布时间】:2011-10-15 21:31:05 【问题描述】:

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>

crossdomain.xml:

<?xml version="1.0"?>
<!DOCTYPE cross-domain-policy>
<cross-domain-policy>
  <allow-http-request-headers-from domain="*" headers="*" secure="true" />
</cross-domain-policy>

这里没什么特别的,它是数百万 WCF 服务用来允许 Silverlight 客户端访问它们的标准设置。不幸的是,此设置在我部署到的实时环境中不起作用。用于测试部署的预生产环境的设置与实际环境相同(或者系统管理员声称如此),并且在那里一切正常,这就是我如此困惑的原因。

我让其中一位系统管理员使用 HTTPDebuggerPro 跟踪 Silverlight 客户端的请求,它显示客户端正在检索 clientaccesspolicy.xmlcrossdomain.xml 没有问题(HTTP 状态 200)。但是,在请求这些文件后,客户端会尝试调用服务并立即收到CrossDomainException

我还尝试让系统管理员将 WCF 服务 URL 添加到 Silverlight 客户端所在框上的 Internet Explorer 的“允许的站点”列表中(根据 http://blogs.msdn.com/b/fiddler/archive/2010/11/22/fiddler-and-silverlight-cross-zone-cross-domain-requests.aspx 的最后一段的最后一句),但是那也没用。

哈哈!

【问题讨论】:

您找到解决方案了吗?我正面临同样的问题 【参考方案1】:

clientaccesspolicy.xml 是否放置在您域的根目录中?

【讨论】:

这两个文件都位于服务作为虚拟应用程序托管的子目录中(C:\inetpub\wwwroot\MyServices 映射到 IIS 中的 /MyServices,crossdomain.xml 位于 C:\inetpub \wwwroot\MyServices\crossdomain.xml)。 您可以尝试将它们移动到您域的根目录吗?根据 MSDN,它应该放在“托管服务的域的根目录,以配置服务以允许跨域访问。” 两个 .xml 文件都在 C:\inetpub\wwwroot\ 和 C:\inetpub\wwwroot\MyServices\ 中。

以上是关于Silverlight 到 WCF 跨域异常,但正在成功读取 clientaccesspolicy.xml的主要内容,如果未能解决你的问题,请参考以下文章

跨域 WCF - Silverlight 配置错误 a:ActionNotSupported

WCF 跨域策略安全错误

获取 Silverlight 5 WCF 服务的完整异常跟踪

WCF跨域策略安全性错误

如何针对已部署的服务 [跨域问题] 调试 Silverlight 应用程序?

ASP.NET 中的 WCF 模拟异常