【问题标题】:Controller JsonResult method always return status code 200 (OK)控制器 JsonResult 方法总是返回状态码 200 (OK)
【发布时间】:2016-07-28 04:14:23
【问题描述】:

我有一个这样的代码块:

public class AccountController : Controller
{
    [HttpPost]
    public JsonResult Check(LoginModel model){
        ...
        Response.StatusCode = (int)HttpStatusCode.Unauthorized;
        return Json( new { ErrorMessage = "..." } );
    }
}

这个逻辑我想把状态码401发回给客户端。

在我的前端,我使用 jquery ajax 方法来调用这个方法。

$.ajax({
  ...
  success: function(data, textStatus, xhr){
  ...
  },
  error: function(xhr, textStatus, error){
  ...
  }
});

但是,永远无法到达错误回调。

我用postman调试,发现不管什么我总是收到200(OK)。

你们知道这里发生了什么吗?

【问题讨论】:

    标签: asp.net-mvc asp.net-mvc-4 asp.net-ajax


    【解决方案1】:

    遗憾的是,这是默认行为。每当您获得未经授权的访问 (401) 时,MVC 就会启动并将您重定向到登录页面,您的 200(OK) 来自哪里,这就是为什么您永远不会得到您想要的响应 - 401。 为了能够返回 401 代码,您必须像这样显式禁止您的响应的身份验证重定向:

    HttpContext.Response.SuppressFormsAuthenticationRedirect = true;
    

    所以你得到的是:

    public class AccountController : Controller
    {
        [HttpPost]
        public JsonResult Check(LoginModel model)
        {
            ...
            Response.StatusCode = (int)HttpStatusCode.Unauthorized;
            Response.SuppressFormsAuthenticationRedirect = true;
            return Json( new { ErrorMessage = "..." } );
        }
    }
    

    【讨论】:

      【解决方案2】:

      我在我的 ASP.Net MVC 5 应用程序中也遇到过这个问题。在我的情况下,我使用带有 ASP.Net Identity v 2.0 的 OWIN 中间件来验证用户身份。奇怪的是,Katana 项目的默认行为是将 HTTP 代码从 401 覆盖到 200,并将原始代码 401 与相关消息放在名为

      的标头中
      *X-Responded-JSON*, like this:
      *X-Responded-JSON: {"status":401,"headers":{"location":"http:\/\/localhost:59540\/Account\/Login?ReturnUrl=%2Fapi%2FTestBasic"}}*
      

      为了抑制默认行为,您需要更新 StartUp 类。更多您可以在这里找到: http://kevin-junghans.blogspot.in/2013/12/returning-401-http-status-code-on.html

      这是基于此帖子的解决方案: https://brockallen.com/2013/10/27/using-cookie-authentication-middleware-with-web-api-and-401-response-codes/

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2022-10-04
        • 2018-01-14
        • 2016-02-10
        • 2021-12-18
        • 2018-11-12
        • 2018-12-26
        • 1970-01-01
        • 2015-01-04
        相关资源
        最近更新 更多