gpt4 book ai didi

asp.net-mvc - ASP.NET MVC 用户友好的 401 错误

转载 作者:行者123 更新时间:2023-12-03 13:32:06 25 4
gpt4 key购买 nike

我在 ASP.NET MVC 站点 in a way like suggests this post 中实现了错误处理.

404错误一切正常。但是如何正确显示 的用户友好屏幕401 错误 ?它们通常不会抛出可以在 Application_Error() 内部处理的异常。而是操作返回 HttpUnauthorizedResult。一种可能的方法是将以下代码添加到 Application_EndRequest() 的末尾方法

if (Context.Response.StatusCode == 401)
{
throw new HttpException(401, "You are not authorised");
// or UserFriendlyErrorRedirect(new HttpException(401, "You are not authorised")), witout exception
}

但是里面 Application_EndRequest() Context.Session == null, errorController.Execute()失败,因为它不能使用默认的 TempDataProvider。
  // Call target Controller and pass the routeData.
IController errorController = new ErrorController();
errorController.Execute(new RequestContext(
new HttpContextWrapper(Context), routeData)); // Additional information: The SessionStateTempDataProvider requires SessionState to be enabled.

那么,您能否建议一些如何在 ASP.NET MVC 应用程序中“用户友好地处理”401 的最佳实践?

谢谢。

最佳答案

查看 HandleErrorAttribute。从它子类化或添加您自己的实现来处理您感兴趣的所有状态代码。您可以让它为每种错误类型返回一个单独的错误 View 。

以下是如何创建句柄错误异常过滤器的想法。我已经扔掉了大部分东西,只专注于我们的必需品。绝对看一下原始实现以添加参数检查和其他重要的事情。

public class HandleManyErrorsAttribute : FilterAttribute, IExceptionFilter
{
public virtual void OnException(ExceptionContext filterContext)
{
if (filterContext.ExceptionHandled || !filterContext.HttpContext.IsCustomErrorEnabled)
return;

Exception exception = filterContext.Exception;

string viewName = string.Empty;
object viewModel = null;
int httpCode = new HttpException(null, exception).GetHttpCode();
if (httpCode == 500)
{
viewName = "Error500View";
viewModel = new Error500Model();
}
else if (httpCode == 404)
{
viewName = "Error404View";
viewModel = new Error404Model();
}
else if (httpCode == 401)
{
viewName = "Error401View";
viewModel = new Error401Model();
}

string controllerName = (string)filterContext.RouteData.Values["controller"];
string actionName = (string)filterContext.RouteData.Values["action"];
filterContext.Result = new ViewResult
{
ViewName = viewName,
MasterName = Master,
ViewData = viewModel,
TempData = filterContext.Controller.TempData
};
filterContext.ExceptionHandled = true;
filterContext.HttpContext.Response.Clear();
filterContext.HttpContext.Response.StatusCode = httpCode;

filterContext.HttpContext.Response.TrySkipIisCustomErrors = true;
}
}

然后你用这个属性“装饰”你的 Controller Action :
[HandleManyErrors]
public ActionResult DoSomethingBuggy ()
{
// ...
}

关于asp.net-mvc - ASP.NET MVC 用户友好的 401 错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1679881/

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