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

Kro*_*nos 6 javascript c# ajax asp.net-mvc

我需要抛出HttpException期间AjaxRequestControllerCustomFilterAttribute

当我把ExceptionController403错误

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

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

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

我怎么能扔HttpException在我FilterAttribute和获得客户端页面的代码.我尝试这样做,但我得到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;
        }
    }
Run Code Online (Sandbox Code Playgroud)

当我尝试投入时Exception,FilterAttribute500再次获得状态代码

Dar*_*rov 6

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

当您将状态代码设置为401时,会发生一些令人讨厌的事情:您将通过ASP.NET Forms身份验证模块自动重定向到"登录"页面=>登录页面的状态代码为200. Phil Haack在以下问题中解决了此问题博客文章.

throw new HttpException((int)HttpStatusCode.Forbidden, "Forbidden");你的控制器动作而言,你抛出一个HttpException类型的异常并将其StatusCode设置为401但除此之外绝对没有任何东西可以捕获这个异常并设置相应的响应状态代码.因此异常起泡,因为您可能没有全局异常处理程序,所以它被服务器翻译为500错误页面.

以下是您可能会发现有用的全局异常处理程序的示例.