Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/wcf/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Silverlight WCF+;SSL安全错误-从未请求crossdomain.xml_Wcf_Silverlight 4.0_Https_Crossdomain.xml_Clientaccesspolicy.xml - Fatal编程技术网

Silverlight WCF+;SSL安全错误-从未请求crossdomain.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服务的策略。你 可能需要联系服务的所有者才能发布跨域服务 策

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

我有一个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有问题,但也可能在服务器发出无效证书时引发。在我的场景中,情况似乎并非如此

我确信以下各项设置正确:
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流量”设置,因为我已经禁用了它)

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


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

连接服务器请求的响应代码是什么?当我访问您在浏览器中提供的链接时,我会收到“403-禁止:访问被拒绝”“响应我得到的响应代码为200。该链接返回403,因为我正在链接到受限制的域的根。我不想链接到的服务终结点是可公开访问的,因此返回200.visite的响应。这可能是有帮助的。