如何在Ajax(Post)请求期间抛出自定义http状态码

本文关键字:自定义 http 状态 请求 Ajax Post | 更新日期: 2023-09-27 18:16:23

我需要在ControllerCustomFilterAttributeAjaxRequest中抛出HttpException

当我抛出ExceptionController403错误

[HttpPost]
[CustomAuthorize]
public ActionResult AjaxSelectBinding()
{
     // 403 Error code
     throw new HttpException((int)HttpStatusCode.Forbidden, "Forbidden");
}

在客户端脚本我总是得到结果代码- 500

 $.ajax({
            type: 'POST',
            url: '/Groups/AjaxSelectBinding',
            success: function(data) {
            },
            error: function (xhr, ajaxOptions, thrownError) {
                 // HERE I GET ALWAYS 500 ERROR CODE
            }
        });

我如何在我的FilterAttribute中抛出HttpException并在客户端页面中获得此代码。我尝试这样做,但我得到200状态代码:

public class CustomAuthorize : AuthorizeAttribute
{
    public override void OnAuthorization(AuthorizationContext filterContext)
    {
        base.OnAuthorization(filterContext);
        SharedControllerBase ctrl = (SharedControllerBase)filterContext.Controller;
        if (!ctrl.User.Identity.IsAuthenticated &&
             filterContext.HttpContext.Request.IsAjaxRequest())
        {
            filterContext.HttpContext.Response.TrySkipIisCustomErrors = true;
            filterContext.HttpContext.Response.StatusCode = (int)HttpStatusCode.Unauthorized;
        }
    }

当我尝试在FilterAttribute中抛出Exception时,我再次获得500状态码

如何在Ajax(Post)请求期间抛出自定义http状态码

重要的是HttpStatusCode.Unauthorized = 401,不是403状态码。这两个代码之间有一个重要的区别。

当你将状态码设置为401时,一些讨厌的事情发生了:ASP会自动将你重定向到登录页面。. NET Forms身份验证模块=>登录页面提供状态码= 200。Phil Haack在下面的博文中提到了这个问题。

throw new HttpException((int)HttpStatusCode.Forbidden, "Forbidden");而言,在你的控制器动作中,好吧,你抛出一个类型为HttpException的异常,其StatusCode设置为401,但除此之外,绝对没有什么可以捕获此异常并设置相应的响应状态码。因此,异常弹出,并且由于您可能没有全局异常处理程序,因此它被服务器翻译为500错误页。

下面是一个全局异常处理程序的示例,您可能会发现它很有用。