在某些浏览器中第一次没有请求clientaccesspolicy.xml

时间:2011-10-21 09:04:22

标签: silverlight silverlight-4.0

我在Silverlight 4中使用跨域webservice调用遇到了一个奇怪的问题。

应用程序在启动后立即调用同一主机上的Web服务,但是在另一个端口上(例如,应用程序位于http://www.mydomain.com:80,Web服务位于http://www.mydomain.com:81) )。没有涉及SSL。 主机提供了一个正确的clientaccesspolicy.xml文件,一切正常正常(如99.9%)。

但是,在某些情况下,浏览器不会请求clientaccesspolicy.xml,因此Web服务调用被阻止并因跨域错误而失败。

在典型情况下,这是您使用Fiddler或Chrome开发人员工具看到的一系列请求:

  • index.html(托管Silverlight应用程序的页面)
  • 的Silverlight.js
  • application.xap
  • clientaccesspolicy.xml(请求并正确下载)
  • webservice call

在某些情况下,您只能看到

  • index.html(托管Silverlight应用程序的页面)
  • 的Silverlight.js
  • application.xap
  • - >跨域错误(没有请求clientaccesspolicy,没有Web服务调用)。

如果所有这些条件都成立,这只发生在少数几台机器上(全部运行Windows 7):

  • Chrome,Firefox或浏览器外运行的应用程序(IE始终有效)
  • 第一次加载页面 (例如,如果您点击浏览器的重新加载按钮,则问题就会消失。关闭/重启浏览器,第一次出现问题时)
  • 没有Fiddler 正在运行(如果您通过Fiddler运行流量,则问题就会消失)。 Chrome开发者工具无效。
  • 该计算机位于与应用程序服务器相同的域中。如果您从外部网络(使用同一台计算机)访问该页面,则问题不存在。

在这些机器上,在这种情况下,问题是100%可重复的。

可能导致这种情况的原因是什么?我可以采取哪些步骤来跟踪问题?

1 个答案:

答案 0 :(得分:11)

这个问题显然非常罕见,但在微软的帮助下我找到了解决方案。我发布它以供将来参考,以便有希望this不会再发生。

作为安全措施, Silverlight会阻止Internet区域和本地Intranet区域之间的任何跨域调用。在这种情况下,它甚至不会请求clientaccesspolicy.xml。因此,如果应用程序托管在www.myhost.com(Internet区域)上,Silverlight将阻止他在www.another.com(本地Intranet区域)上调用Web服务。

This blog post详细解释了这一点。

因此,如果您有以下一种或几种症状(尽管已丢弃明显的跨域错误,例如格式错误或错误放置的clientaccesspolicy.xml):

  • 来自一些显然随机的机器(几个不同的位置/域)的跨域错误,但是从其他机器工作
  • clientaccesspolicy.xml根本没有要求
  • 适用于某些浏览器,不适用于其他浏览器。显然是随机的,有时不使用任何浏览器。
  • 当Fiddler打开时有时没问题,但没有运行Fiddler的错误
  • 一切在localhost上正常运行

尝试以下操作可能是值得的,以便将应用程序主机和Web服务放在同一安全区域中:

  • 转到IE安全设置(访问网络的任何应用程序也使用这些设置,即任何其他浏览器)
  • 将承载应用程序的地址和承载Web服务的地址添加到本地Intranet 站点 OR
  • 取消选中“自动检测Intranet网络”标记(以便最终都在Internet区域中