gpt4 book ai didi

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

转载 作者:数据小太阳 更新时间:2023-10-29 05:19:58 25 4
gpt4 key购买 nike

我需要在 ControllerCustomFilterAttribute 中的 AjaxRequest 期间抛出 HttpException

当我在 Controller 中抛出 Exception 并出现 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
}
});

如何在我的 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 状态码

最佳答案

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

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

至于 throw new HttpException((int)HttpStatusCode.Forbidden, "Forbidden"); 与您的 Controller 操作有关,您抛出一个 HttpException 类型的异常,其 StatusCode设置为 401 但除此之外绝对没有任何东西可以捕获此异常并设置相应的响应状态代码。因此异常会冒泡,并且由于您可能没有全局异常处理程序,它会被服务器转换为 500 错误页面。

这是一个 global exception handler 的例子您可能会觉得有用。

关于c# - 如何在 Ajax(Post) 请求期间抛出自定义 http 状态代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8338347/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com