(我看到几个与我的问题相关的问题,但没有一个解决方案对我有用,因为我在生产中遇到了这个问题,而不是在本地开发过程中,而且我已经尝试了所有建议的修复。)
我有一个使用 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. 服务确实有效(我们有使用它们的各种技术的其他客户端,包括依赖跨域的 Adobe 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 中的受信任站点。但是,相同的解决方法不适用于生产,即使那样它也不是可接受的解决方法。但是我必须在开发环境中执行此操作的事实让我担心我一路上错过了什么......)