7

(我看到几个与我的问题相关的问题,但没有一个解决方案对我有用,因为我在生产中遇到了这个问题,而不是在本地开发过程中,而且我已经尝试了所有建议的修复。)

我有一个使用 IIS 托管的 WCF 服务的 Silverlight 4 应用程序。在生产环境中,这些服务是通过 HTTPS 访问的。尽管有一个有效的 crossdomain.xml文件,但在访问服务时我仍然会遇到著名的“安全错误”:

尝试向 URI“ https://MYDOMAIN/MYSERVICE.svc ”发出请求时出错。这可能是由于在没有适当的跨域策略或不适合 SOAP 服务的策略的情况下尝试以跨域方式访问服务。您可能需要联系服务的所有者以发布跨域策略文件并确保它允许发送与 SOAP 相关的 HTTP 标头。此错误也可能是由于在 Web 服务代理中使用内部类型而不使用 InternalsVisibleToAttribute 属性造成的。有关更多详细信息,请参阅内部异常。---> System.Security.SecurityException ---> System.Security.SecurityException: 安全错误...

使用 Fiddler 我可以看到没有对 crossdomain.xml 或 clientaccesspolicy.xml 发出请求。对服务器有一个 CONNECT 请求,但仅此而已。

我读过这个错误,虽然它表明 crossdomain.xml/clientaccesspolicy.xml 有问题,但也可以在服务器颁发无效证书时引发。在我的场景中似乎并非如此。

我确定以下设置正确:
1. crossdomain.xml 有效并托管在站点的根目录中
2. 服务确实有效(我们有使用它们的各种技术的其他客户端,包括依赖跨域的 Adob​​e Flex .xml。)
3. Silverlight 应用程序确实可以工作(它可以与本地服务和共享开发服务器上的服务一起正常工作***)
4. Silverlight 应用程序甚至不会尝试请求 crossdomain.xml 或 clientaccesspolicy.xml(如Fiddler 确认)
5. Silverlight 应用程序使用正确的配置通过 https 访问 WCF。下面是配置:

<configuration>  
    <system.serviceModel>  
        <bindings>  
            <basicHttpBinding>  
                <binding name="BasicHttpBinding_IMyServices" maxBufferSize="2147483647" maxReceivedMessageSize="2147483647">  
                    <security mode="Transport" />  
                </binding>  
                </basicHttpBinding>  
        </bindings>  
        <client>  
            <endpoint address="https://MYDOMAIN/MYSERVICE.svc" binding="basicHttpBinding" bindingConfiguration="BasicHttpBinding_IMyServices" contract="Services.IMyServices" name="BasicHttpBinding_IMyServices" />  
        </client>  
    </system.serviceModel>  
</configuration>

还有什么可能导致这种问题?可能是因为 Web 服务器是负载平衡的吗?还是我没有注意到的证书有问题?如果您至少可以为我指出正确的方向,那将不胜感激。

(***值得指出的一点:我在我们的开发环境中遇到了类似的问题。Silverlight 应用程序无法访问共享开发服务器上的 WCF 服务,尽管有正确的 crossdomain.xml 并且不使用 HTTPS。我解决了它通过将开发服务器添加为 IE 中的受信任站点。但是,相同的解决方法不适用于生产,即使那样它也不是可接受的解决方法。但是我必须在开发环境中执行此操作的事实让我担心我一路上错过了什么......)

4

2 回答 2

11

问题是我缺少clientaccesspolicy.xml。在这种情况下,拥有 crossdomain.xml 是不够的。我认为这是因为 WCF 调用不仅是跨浏览器,而且是跨协议(Silverlight 应用程序是通过 http 提供的,但服务是通过 https 提供的)。

此外,我的 clientaccesspolicy.xml 必须明确允许 http 访问,如下所示:

<?xml version="1.0" encoding="utf-8"?>  
<access-policy>  
    <cross-domain-access>  
        <policy>  
            <allow-from http-request-headers="SOAPAction">  
                <!-- IMPORTANT! Include these lines -->
                <domain uri="http://*"/>  
                <domain uri="https://*"/>  
            </allow-from>  
            <grant-to>  
                <resource path="/" include-subpaths="true"/>  
            </grant-to>  
        </policy>  
    </cross-domain-access>  
</access-policy>

它现在就像一个魅力。

一路上让我绊倒的几件事:

  • 我的浏览器正在缓存 clientaccesspolicy.xml 和 crossdomain.xml。每次更改其中一个文件时,我都必须清除缓存,否则它将无法识别较新的版本,尽管 IIS 已配置为阻止客户端缓存此文件。
  • 对 clientaccesspolicy.xml 和 crossdomain.xml 的请求并不总是出现在 Fiddler 中。相反,我经常会看到 CONNECT 请求。我不明白为什么会这样,但我已经学会了不依赖 Fiddler 来确认这些请求正在发出。也许我在某处有一些恶意设置(它不是“解密 HTTPS 流量”设置,因为我已经禁用了它)。
于 2011-02-01T15:32:35.910 回答
3

我有同样的错误,当我尝试通过 http 调用我的站点并且我的服务通过 https 时失败了。发生此错误是因为我的 ISS 没有证书,因此,当应用程序尝试下载 clientaccesspolicy 时,它失败了。

查看浏览器上的任何调试工具并查找 clientacccesspolicy 文件,然后检查它是否正在下载。

于 2011-06-20T20:38:02.410 回答