我正在开发一个Silverlight 5应用程序,它能够使用wcf web服务获取数据。但是,一旦尝试保存或删除,就会请求clientaccessppolicy .xml文件。这个请求发生在HTTP协议中,然后浏览器报告Display mixed content
javascript弹出对话框。异步调用(如BeginSaveChanges
)静默失败,在回调中没有得到错误消息。为什么这个通过HTTPS工作和获取数据的应用程序突然想要客户端访问策略文件,然后一切都停止了?
在失败之前,Fiddler显示了对实际web服务的成功调用以获取数据。但是在进行保存/删除调用时,对根clientaccesspolicy的http调用被重定向到子域clientaccesspolicy.xml。
Fiddler Session Capture
# Result Protocol Host URL Body Caching Content-Type Process Comments Custom
285 200 HTTPS test.application.company.com /SUBSITE/WebService.svc/Terms()?$orderby=Description...{removed}... 742,658 no-cache application/atom+xml;type=feed;charset=utf-8 iexplore:16376
286 302 HTTP test.application.company.com /clientaccesspolicy.xml 189 text/html; charset=UTF-8 iexplore:16376
287 200 HTTP test.application.company.com /SUBSITE/clientaccesspolicy.xml 341 text/xml iexplore:16376
288 302 HTTP test.application.company.com /crossdomain.xml 182 text/html; charset=UTF-8 iexplore:16376
289 200 HTTP test.application.company.com /SUBSITE/crossdomain.xml 170 text/xml iexplore:16376
由于失败,我没有在Fiddler中看到实际的web服务调用,但当我在HTTPS下本地运行它时,我确实看到了它。
勘误表
- 我正在访问的测试服务器确实有一个负载平衡器。
- 当我在本地机器的IIS上调试它时,它可以工作,我确实看到正确的删除调用通过
mixed content all in
https ' per Fiddler没有问题。 - 如上所述,托管控制的网站位于指定的主要(默认站点)
SUBSITE
以下的级别。 - 通过传入
https://test.application.company.com/SUBSITE/WebService.svc
的url来创建上下文,而不是使用ServiceReferences.ClientConfig
的默认url。 - 上面使用的测试服务器证书是一个自签名证书,由于不受信任而存在问题。
主站点和托管站点都有clientaccessppolicy .xml和crossdomain.xml。
<access-policy> <cross-domain-access> <!-- Silverlight 3 or higher requires the http-request-headers attribute. --> <policy> <allow-from http-request-headers="*" https-request-headers="*"> <domain uri="https://*" /> <domain uri="http://*" /> </allow-from> <grant-to> <resource path="/" include-subpaths="true"/> </grant-to> </policy> </cross-domain-access> </access-policy>
答案在负载均衡器中。一旦平衡器使用SSL证书与web服务通信,混合模式页面就消失了。