我有一个ASP。. NET web服务使用[ScriptService]属性启动并运行。从我读到的这篇文章来看:
http://weblogs.asp.net/scottgu/archive/2007/04/04/json-hijacking-and-how-asp-net-ajax-1-0-mitigates-these-attacks.aspxASP。. NET默认情况下不允许JSONP请求(通过注入DOM)拒绝跨域请求。它通过采取两项措施来实现:
1)只接受POST请求(通过脚本注入总是GET)2)拒绝连接发送内容类型的HTTP头,而不是"Content-type: application/json"(浏览器不会发送)。
我熟悉跨域问题,我知道什么是JSONP,我完全理解,为什么ASP。. NET在默认情况下以这种方式受到限制。
但是现在,我有了我的webservice,它是一个公共的,应该对所有人开放。所以我明确地需要启用跨域请求通过Javascript到我的Webservice,这样外部网站可以检索数据通过我的Webservice从jquery和类似的。
我已经介绍了步骤(1),允许通过GET通过修改ScriptMethod属性的请求:[ScriptMethod(UseHttpGet=true)]。我已经检查了jQuery, GET请求现在工作(在同一域)。但是如何到达固定点(2)呢?
我知道一些浏览器支持Allow-Origin-*标头,但恐怕它还不是标准的,我不想强迫我的用户/客户修改他们使用我的web服务的HTTP标头。
总结一下:我需要一个好的实践来通过JSON为公共web服务启用ScriptingService的跨域请求。我的意思是,一定有一种方法可以让web服务公开,这就是大多数web服务的目的。
使用传统的ASMX服务来做这样的事情似乎是注定要失败的。试试WCF吧,由于它的可扩展性,它可以很容易地启用JSONP。因此,如果您正在寻求最佳实践,WCF是您应该在。net平台上构建web服务的技术。
或者,如果你现在真的负担不起迁移到。net 3.5,你也可以编写一个自定义http处理程序(.ashx
)来完成这项工作。
jQuery ajax()函数确实有一个'crossDomain'属性。
粘贴自jQuery.ajax()
crossDomain (1.5)默认值:同域请求为false,跨域请求为true如果希望在同一域中强制crossDomain请求(如JSONP),请将crossDomain的值设置为true。例如,这允许服务器端重定向到另一个域