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