我们最近一直在开发一个相当现代的网络应用程序,并准备将其部署到alpha / beta并获得一些真实的体验。
我们有基于ASP.Net的Web服务(Web Api)和JavaScript前端,它是使用主干的100%客户端MVC。
我们已经购买了我们的域名,为了这个问题,我们的部署如下:
webservices.mydomain.com(Webservices)
mydomain.com(JavaScript前端)
如果JavaScript试图与子域上的Web服务进行通信,那么我们就会遇到跨域问题,我已经玩过CORS,但是对于跨浏览器的支持并不满意所以我把它算作一个选项。
在我们的开发PC上,我们使用IIS反向代理将所有请求转发到mydomain.com/webservices到webservices.mydomain.com - 这解决了我们所有的问题,因为浏览器认为一切都在同一个域中。
所以我的问题是,在公开部署中,这个问题最常见的解决方法是什么?反向代理是正确的方法吗?如果有,是否有任何托管服务为这种情况提供反向代理?是否有更好的部署方法?
我想使用CloudFront CDN,因为我们所有的服务器/服务都是由亚马逊托管的,我真的很难找到有关CDN是否可以支持这种类型设置的信息。
由于
答案 0 :(得分:1)
您要做的是跨子域调用,而不是完全跨域调用。 这就是技巧:http://www.tomhoppe.com/index.php/2008/03/cross-sub-domain-javascript-ajax-iframe-etc/
正如被问及这个问题最常见的解决方法。我的回答是:这个问题通常是避免的。在现实世界中,您可以设置您的域,例如您不需要为了让您的应用程序运行或设置代理服务器为您转发呼叫而需要这样的方法。 JSONP也是一个黑客攻击解决方案。
答案 1 :(得分:1)
要允许使用ASP.NET AJAX从脚本调用此Web Service,请将以下行添加到第一个Web服务代码隐藏:
[System.Web.Script.Services.ScriptService]
答案 2 :(得分:0)
您可以简单地将JSONP用于AJAX请求,然后跨域不是问题。
如果AJAX请求返回一些HTML,则可以将其转义为JSON字符串。
第二个有点尴尬。
答案 3 :(得分:0)
你有2/3层
在网络服务 code-behin类中,添加此属性:<System.Web.Script.Services.ScriptService()> _
也许您需要在web.config的System.web节点中添加它:
<webServices>
<protocols>
<add name="AnyHttpSoap"/>
<add name="HttpPost"/>
<add name="HttpGet"/>
</protocols>
</webServices>
在客户端界面
- 在子域上添加对该服务的Web引用(例如:webservices.mydomain.com/svc.asmx) Visual Studio制作“代理类”
-add功能在主页的|页面|控件的代码中 - 从客户端
简单地调用此函数您可以在scriptmanager中使用AJAX功能,也可以使用其他系统,如JQuery。
如果您的主网站是使用.NET 3.5或更早版本编译的,则需要添加对命名空间System.Web.Extensions的引用,并在web.config文件中声明它。
答案 4 :(得分:0)
如果您有足够的带宽(网络I / O和CPU)来处理这个问题,那么反向代理就是一个很好的解决方案。一个好的反向代理甚至可以缓存静态调用,以帮助缓解代理引入的网络延迟。
另一种选择是设置正确的跨域策略文件和/或标头。在某些云提供商中执行此操作可能很困难甚至不可能。我最近遇到了字体文件的问题,IE对跨域调用不满意。我们无法获得我们用于设置正确标头的云存储提供程序,因此我们在本地托管它们而不必处理反向代理。
答案 5 :(得分:0)
easyXDM是一个跨域Javascript插件,可能值得探索。它在浏览器支持标准时使用标准,并抽象出浏览器不支持标准时所需的各种黑客。来自easyXDM.net:
easyXDM是一个Javascript库,可以让您作为开发人员使用 轻松解决同源的限制 策略反过来又很容易沟通和公开javascript API跨域边界。
核心easyXDM提供了一个能够通过的传输堆栈 基于字符串的消息在两个窗口之间,一个消费者(主要的 文档)和提供者(使用iframe包含的文档)。它 通过使用几种可用技术之一来做到这一点 为当前浏览器选择最有效的一个。对全部 实现传输堆栈提供双向性, 可靠性,排队和发送者验证。
easyXDM的目标之一是支持所有的浏览器 常用,并为所有人提供相同的功能。其中一个 实现这一目标的策略是遵循既定标准,加上 使用特征检测来确保使用最有效的方法。
引用简单的XDM作者:
...像LinkedIn,Twitter和Disqus这样的网站以及应用程序运行 由诺基亚和其他人已经建立了自己的应用程序 消息框架由easyXDM提供。
所以easyXDM显然不是一些poxy hack,但我承认它对你的项目有很大的依赖。
网络的当前状态是,如果要推送信封,则必须使用功能检测和polyfill,或者只是强制用户升级到HTML5浏览器。如果这让你感到不安,那么你并不孤单,但是填充物是一种暂时的邪恶,需要从网络到达我们想要的地方。