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

时间:2011-12-01 08:24:07

标签: c# javascript ajax asp.net-mvc

我需要在HttpException AjaxRequestController

期间CustomFilterAttribute投掷Exception

当我Controller 403[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 } });

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; } } 状态代码:

Exception

当我尝试在FilterAttribute中抛出500时,我再次获得{{1}}状态代码

1 个答案:

答案 0 :(得分:6)

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

当您将状态代码设置为401时,会发生一些讨厌的事件:您将通过ASP.NET Forms身份验证模块自动重定向到“登录”页面=>登录页面的状态代码为200.Phil Haack在following blog post中解决了这个问题。

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

以下是您可能会觉得有用的global exception handler示例。