Silverlight WCF+;SSL安全错误-从未请求crossdomain.xml
(我看到了几个与我的问题相关的问题,但没有一个解决方案对我有效,因为我在生产过程中遇到了这个问题,而不是在本地开发过程中,我已经尝试了所有建议的修复方案。) 我有一个Silverlight 4应用程序,它使用IIS托管的WCF服务。在生产中,这些服务通过HTTPS访问。尽管有文件,但在访问服务时仍会出现著名的“安全错误”: 尝试向URI发出请求时出错 ''. 这可能是由于试图 以跨域方式访问服务,而无需适当的跨域 策略,或不适合SOAP服务的策略。你 可能需要联系服务的所有者才能发布跨域服务 策略文件,以确保允许使用与SOAP相关的HTTP头 发送。此错误也可能是由于在web中使用内部类型造成的 不使用InternalsVisibleToAttribute属性的服务代理。 有关详细信息,请参阅内部异常。--> System.Security.SecurityException--> System.Security.SecurityException:安全错误 使用Fiddler,我可以看到没有对crossdomain.xml或clientaccesspolicy.xml发出任何请求。有一个到服务器的连接请求,但仅此而已 我已经了解到,这个错误,尽管它表明crossdomain.xml/clientaccesspolicy.xml有问题,但也可能在服务器发出无效证书时引发。在我的场景中,情况似乎并非如此 我确信以下各项设置正确:Silverlight WCF+;SSL安全错误-从未请求crossdomain.xml,wcf,silverlight-4.0,https,crossdomain.xml,clientaccesspolicy.xml,Wcf,Silverlight 4.0,Https,Crossdomain.xml,Clientaccesspolicy.xml,(我看到了几个与我的问题相关的问题,但没有一个解决方案对我有效,因为我在生产过程中遇到了这个问题,而不是在本地开发过程中,我已经尝试了所有建议的修复方案。) 我有一个Silverlight 4应用程序,它使用IIS托管的WCF服务。在生产中,这些服务通过HTTPS访问。尽管有文件,但在访问服务时仍会出现著名的“安全错误”: 尝试向URI发出请求时出错 ''. 这可能是由于试图 以跨域方式访问服务,而无需适当的跨域 策略,或不适合SOAP服务的策略。你 可能需要联系服务的所有者才能发布跨域服务 策
1.crossdomain.xml有效,并托管在站点的根目录中
2.这些服务确实有效(我们还有其他使用它们的各种技术的客户端,包括依赖于crossdomain.xml的Adobe Flex。)
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中将开发服务器添加为受信任的站点来解决这个问题。但是,同样的解决方法und不适用于生产环境,即使这样,它也不是一个可接受的解决方案。但是,我必须在开发环境中这样做,这让我担心我错过了一些东西……)问题是我缺少clientaccesspolicy.xml。在这种情况下,拥有crossdomain.xml是不够的。我认为这是因为WCF调用不仅是跨浏览器的,而且是跨协议的(Silverlight应用程序是通过http提供的,但服务是通过https提供的) 此外,my 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流量”设置,因为我已经禁用了它)
查看浏览器上的任何调试工具并查找ClientAccessPolicy文件,然后检查该文件是否正在下载。连接服务器请求的响应代码是什么?当我访问您在浏览器中提供的链接时,我会收到“403-禁止:访问被拒绝”“响应我得到的响应代码为200。该链接返回403,因为我正在链接到受限制的域的根。我不想链接到的服务终结点是可公开访问的,因此返回200.visite的响应。这可能是有帮助的。