在ASP.NET MVC代码中识别AngularJS AJAX调用

13

我正在使用ASP.NET MVC和AngularJS开发一个示例应用程序。

在服务器端代码中,我编写了一个Action筛选器属性,需要检查请求是否为普通请求(浏览器)或AJAX请求。

public override void OnActionExecuting(ActionExecutingContext filterContext)
{
    if ( filterContext.HttpContext.Request.IsAjaxRequest())
     {

     }
}

以上代码片段中提到的“IsAjaxRequest()”方法在使用 $http Angular 服务进行AJAX请求时没有返回TRUE。

我注意到该请求没有X-Requested-With头,即使添加了该头也不能解决请求问题。

注意:这不是CORS调用。

所以我的问题是:

  1. filterContext.HttpContext.Request.IsAjaxRequest()如何判断请求是否为AJAX?

  2. 我可以检查请求头(它是否有特定的头)并确定请求是否为AJAX。这是正确且唯一的方法吗?


1
提醒一下,它是开源的,你可以查看实际的实现:https://aspnetwebstack.codeplex.com/SourceControl/latest#src/System.Web.Mvc/AjaxRequestExtensions.cs - Keith Rousseau
@Keith Rousseau 提供的链接将来对我很有帮助。 - refactor
1个回答

20

通过查看是否存在X-Requested-With头部来做出决策。 你可以手动向$http服务添加X-Request-With头部。

单个请求。

$http.get('/controller/action', {
   headers: {
    'X-Requested-With': 'XMLHttpRequest'
   }
});

每个请求都会

app.config(['$httpProvider', function ($httpProvider) {
  $httpProvider.defaults.headers.common["X-Requested-With"] = 'XMLHttpRequest';
}]);

你可以看到为什么它在Angular中缺失。


事实上,我确实添加了建议的标题,但问题出在标题的值上,它不是“XMLHttpRequest”,而是“true”,天知道我为什么会给出那个值:)。提供的链接也很有帮助。谢谢。 - refactor

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接