允许对ASP.NET ScriptService的跨域请求

时间:2011-07-19 16:21:36

标签: asp.net web-services cross-domain jsonp scriptservice

我已经使用[ScriptService]属性启动并运行了一个ASP.NET Webservice。从我从这篇文章中读到的内容:

http://weblogs.asp.net/scottgu/archive/2007/04/04/json-hijacking-and-how-asp-net-ajax-1-0-mitigates-these-attacks.aspx

ASP.NET默认情况下不允许JSONP请求(通过拒绝跨域请求注入DOM。它通过采取两种措施来实现:

1)只接受POST请求(脚本注入总是通过GET) 2)拒绝发送HTTP头的连接内容类型不是“Content-type:application / json”(浏览器不会发送)。

我熟悉跨域问题,我知道JSONP是什么,我完全理解为什么ASP.NET默认以这种方式受到限制。

但是现在,我的网络服务是公开的,应该向所有人开放。所以我明确需要通过Javascript启用跨域请求到我的Web服务,这样外部网站就可以通过我的web服务从jquery等中检索数据。

我已经介绍了步骤(1),通过以下方式修改ScriptMethod属性来允许通过GET发出请求:[ScriptMethod(UseHttpGet = true)]。我已经检查过jQuery,GET请求现在可以工作(在同域上)。但是如何解决问题(2)?

我知道一些浏览器支持的Allow-Origin- *标题,但是它尚未标准化,我不想强​​迫我的用户/客户修改他们的HTTP标头以使用我的网络服务。

总结一下:我需要通过JSON为公共Web服务启用ScriptingService的跨域请求。我的意思是必须有一种公开Web服务的方式,这就是大多数网络服务的意义所在?

2 个答案:

答案 0 :(得分:0)

使用旧版ASMX服务这样的事情似乎是一个失败的原因。 Try WCF由于其可扩展的性质,很容易JSONP enabled。因此,如果您要求最佳实践,WCF就是您应该在.NET平台上构建Web服务的技术。

或者,如果你现在真的无力迁移到.NET 3.5,你也可以编写一个自定义的http处理程序(.ashx)来完成这项工作。

答案 1 :(得分:0)

jQuery ajax()函数确实有一个'crossDomain'属性。

jQuery.ajax()

粘贴

crossDomain(已添加1.5) 默认值:对于同域请求为false,对于跨域请求为true 如果要在同一域上强制执行跨域请求(例如JSONP),请将crossDomain的值设置为true。例如,这允许服务器端重定向到另一个域