【问题标题】:HTTP to HTTPS silverlight wcf cross domain issueHTTP 到 HTTPS silverlight wcf 跨域问题
【发布时间】:2013-09-30 02:29:05
【问题描述】:

我一直在寻找整个网站和堆栈溢出问题,我可以解决我的问题。

网络设置

我在暂存世界中的网络方式是让客户在 443 端口 - https 上查看我的 Web 应用程序,但底层结构正在侦听 80 端口 - http。因此,当我的应用程序在端口 80 上相互通信时,但当客户端访问站点时,其端口为 443。例如,我从 silverlight 调用的 svc 将在端口 80 上。

我还应该指出,在我的暂存域和测试域中:我有一个 Web 服务器作为我的应用服务器的门户;但这并不重要,因为我能够进行测试。只是staging有HTTP转发到HTTPS。

应用程序

我有一个 silverlight xap 文件,它与使用 IIS 6 的托管 Web 应用程序位于同一域中。

现在,由于我的 silverlight xap 文件和我的 web 应用程序在同一个域上,我在开发和测试上运行它没有问题,但是当我尝试部署到暂存时,我遇到了一个奇怪的跨域引用问题:

“System.ServiceModel.CommunicationException: 尝试向 URI 发出请求时发生错误。这可能是由于尝试以跨域方式访问服务而没有适当的跨域策略,或者不适合 Soap 服务的策略。”

四处挖掘,我意识到我的应用程序认为我的 xap(或我正在调用的服务)和我的 Web 应用程序位于不同的域中,并自动查找 crossdomain.xml 和 clientaccesspolicy.xml 文件,我可以不要真的阻止它。但是,在我的应用程序中,情况并非如此。它们都驻留在同一个域中。我使用了 fiddler,但我没有看到任何关于另一个域甚至子域的信息。

浏览器问题

我发现的另一个奇怪的事情是 chrome vs ie 的问题: 在 chrome 上,它发现 crossdomain.xml 和 clientaccesspolicy.xml 告诉我它不安全,然后它从 https 端进行另一次提取,发出 404 错误信号。但是,在 IE 上,我得到了 302 重定向。在微软关于 clientaccesspolicy.xml 的文档中,您不应该从 xml 文件进行任何重定向;这里提到了这一点:http://msdn.microsoft.com/en-us/library/cc838250(v=vs.95).aspx

所以我的问题是,如果我的应用程序和 xap 在同一个域上,为什么那些 xmls 试图获取?是因为我使用的是 DNS 而不是 IP 地址吗?我也偶然发现了这个网站:http://msdn.microsoft.com/en-us/library/ff921170(v=pandp.20).aspx

它指出:为避免跨域调用问题,远程模块的 XAP 文件应位于与主应用程序相同的域中;当像这样部署时,ModuleCatalog 上的 Ref 属性应该是相对于 Web 服务器上主要 XAP 文件位置的统一资源标识符 (URI)。

这到底是什么意思??

编辑

好的,所以我将服务更改为指向 https 而不是 http。但是出现了新错误:提供的 URI 方案“https”无效;预计 http。

好在,它甚至不检查 crossdomain.xml 或 clientaccesspolicy.xml;所以它现在意识到它在同一个域上。但现在它在端口 80 上期待服务,但名称必须遵循 https:// 才能使其工作。

我认为我现在唯一的解决方案是将其作为虚拟目录断开,使其成为自己网站的根节点,并将整个内容设置为 443。免去我的头疼。

【问题讨论】:

  • 我不确定您的设置是什么,但请注意“同源”意味着 url 的所有 3 个部分必须匹配:架构(http 和 https 不同)、域(需要完全匹配,不区分大小写)和端口(完全匹配)。
  • 如果我将其设为相同的来源,我会收到一个新错误:System.ArgumentException:提供的 URI 方案“https”无效;预期为“http”
  • 应该有几十篇文章如何配置WCF在HTTPS端点上工作...
  • 如果你有一个混合环境,我的端点在端口 80 上,但它们被视为端口 443。但你的方向确实帮助我解决了一些问题。

标签: c# asp.net wcf silverlight cross-domain


【解决方案1】:

听起来您正在使用负载平衡器卸载 SSL 流量的环境中工作。在这种情况下,您的客户端(Silverlight)需要配置为 HTTPS,您的服务器必须配置为 HTTP。这是因为双方之间的设备正在解密 SSL 数据。

在这种情况下,除了正常的客户端和服务器端配置之外,您的服务器端代码需要对请求的地址更加宽容。

您可能还需要向您的服务实现添加一个属性,以允许您的客户端通过 HTTPS 调用,但让您的服务侦听 HTTP。

将此添加到您的服务中:

[ServiceBehavior(AddressFilterMode = AddressFilterMode.Any)]

这允许您的客户端调用https://my.domain.com/service.svc 并让您的服务器位于http://my.domain.com/service.svc

以下是一些可能也有帮助的链接:

http://social.msdn.microsoft.com/Forums/vstudio/en-US/b5ae495b-f5fb-4eed-ae21-2b2280d4fec3/address-filter-mismatch-wcf-addressing

http://www.i-m-code.com/blog/blog/2011/11/30/hosting-silverlight-over-http-under-f5-big-ip/

http://www.i-m-code.com/blog/blog/2011/08/18/hosting-silverlight-under-https/

【讨论】:

    猜你喜欢
    • 2011-05-03
    • 2010-11-24
    • 2011-07-25
    • 2011-09-22
    • 1970-01-01
    • 1970-01-01
    • 2010-12-24
    • 2014-05-02
    • 2011-08-27
    相关资源
    最近更新 更多