如何从ASP.NET MVC 2的ActionFilter中实现错误重定向?
- 内容介绍
- 文章标签
- 相关推荐
本文共计485个文字,预计阅读时间需要2分钟。
从MVC1到MVC2的变化主要包括:
1. 改进了路由系统:MVC2引入了更灵活的路由机制,允许更细粒度的控制。
2.支持自定义模型绑定:MVC2允许开发者自定义模型绑定逻辑,以处理复杂的数据传输。
3.更强大的视图引擎:MVC2提供了更多的视图引擎选项,如Razor视图引擎。
如果用户未经过身份验证,以下代码重定向到登录页面不适用于MVC2,并可能导致System.Web.HttpException:在发送HTTP标头后无法重定向错误:
csharp
public class RequiresAuthenticationAttribute : ActionFilterAttribute{ public override void OnActionExecuting(ActionExecutingContext filterContext) { if (filterContext.HttpContext.User.Identity.IsAuthenticated==false) { filterContext.Result=new RedirectResult(~/Account/Login); } }}此问题可能是由于MVC2的请求管道在发送HTTP标头后不允许重定向导致的。解决方法如下:
csharppublic class RequiresAuthenticationAttribute : ActionFilterAttribute{ public override void OnActionExecuting(ActionExecutingContext filterContext) { if (filterContext.HttpContext.User.Identity.IsAuthenticated==false) { filterContext.Result=new RedirectToRouteResult( new RouteValueDictionary { { controller, Account }, { action, Login } }); } }}
这里使用`RedirectToRouteResult`代替`RedirectResult`,以避免在发送HTTP标头后进行重定向的问题。
从mvc1和mvc2改变了什么?如果用户未经过身份验证,我有以下代码重定向到登录页面.这不适用于mvc2并导致“System.Web.HttpException:在发送HTTP标头后无法重定向”public class RequiresAuthenticationAttribute : FilterAttribute, IAuthorizationFilter { public void OnAuthorization(AuthorizationContext filterContext) { if (!filterContext.HttpContext.User.Identity.IsAuthenticated) { string redirectOnSuccess = filterContext.HttpContext.Request.Url.AbsolutePath; string redirectUrl = string.Format("?ReturnUrl={0}", redirectOnSuccess); string loginUrl = System.Web.Security.FormsAuthentication.LoginUrl + redirectUrl; filterContext.HttpContext.Response.Redirect(loginUrl, true); } } }
堆栈跟踪如下:
System.Web.HttpException: Cannot redirect after HTTP headers have been sent. at System.Web.HttpResponse.Redirect(String url, Boolean endResponse) at System.Web.HttpResponseWrapper.Redirect(String url, Boolean endResponse) at System.Web.Mvc.RedirectResult.ExecuteResult(ControllerContext context) at System.Web.Mvc.ControllerActionInvoker.InvokeActionResult(ControllerContext controllerContext, ActionResult actionResult) at System.Web.Mvc.ControllerActionInvoker.<>c__DisplayClass14.<InvokeActionResultWithFilters>b__11() at System.Web.Mvc.ControllerActionInvoker.InvokeActionResultFilter(IResultFilter filter, ResultExecutingContext preContext, Func`1 continuation) at System.Web.Mvc.ControllerActionInvoker.<>c__DisplayClass14.<>c__DisplayClass16.<InvokeActionResultWithFilters>b__13() at System.Web.Mvc.ControllerActionInvoker.InvokeActionResultWithFilters(ControllerContext controllerContext, IList`1 filters, ActionResult actionResult) at System.Web.Mvc.ControllerActionInvoker.InvokeAction(ControllerContext controllerContext, String actionName) 您所要做的就是覆盖HandleUnauthorizedRequest而不是OnAuthorization,只需将RedirectResult url分配给AuthorizationContext.Result即可.
base.OnAuthorization将检查身份验证,如果失败则调用HandleUnauthorizedRequest.
protected override void HandleUnauthorizedRequest(AuthorizationContext filterContext) { string redirectOnSuccess = filterContext.HttpContext.Request.Url.AbsolutePath; string redirectUrl = string.Format("?ReturnUrl={0}", redirectOnSuccess); filterContext.Result = new RedirectResult(redirectUrl); return; }
本文共计485个文字,预计阅读时间需要2分钟。
从MVC1到MVC2的变化主要包括:
1. 改进了路由系统:MVC2引入了更灵活的路由机制,允许更细粒度的控制。
2.支持自定义模型绑定:MVC2允许开发者自定义模型绑定逻辑,以处理复杂的数据传输。
3.更强大的视图引擎:MVC2提供了更多的视图引擎选项,如Razor视图引擎。
如果用户未经过身份验证,以下代码重定向到登录页面不适用于MVC2,并可能导致System.Web.HttpException:在发送HTTP标头后无法重定向错误:
csharp
public class RequiresAuthenticationAttribute : ActionFilterAttribute{ public override void OnActionExecuting(ActionExecutingContext filterContext) { if (filterContext.HttpContext.User.Identity.IsAuthenticated==false) { filterContext.Result=new RedirectResult(~/Account/Login); } }}此问题可能是由于MVC2的请求管道在发送HTTP标头后不允许重定向导致的。解决方法如下:
csharppublic class RequiresAuthenticationAttribute : ActionFilterAttribute{ public override void OnActionExecuting(ActionExecutingContext filterContext) { if (filterContext.HttpContext.User.Identity.IsAuthenticated==false) { filterContext.Result=new RedirectToRouteResult( new RouteValueDictionary { { controller, Account }, { action, Login } }); } }}
这里使用`RedirectToRouteResult`代替`RedirectResult`,以避免在发送HTTP标头后进行重定向的问题。
从mvc1和mvc2改变了什么?如果用户未经过身份验证,我有以下代码重定向到登录页面.这不适用于mvc2并导致“System.Web.HttpException:在发送HTTP标头后无法重定向”public class RequiresAuthenticationAttribute : FilterAttribute, IAuthorizationFilter { public void OnAuthorization(AuthorizationContext filterContext) { if (!filterContext.HttpContext.User.Identity.IsAuthenticated) { string redirectOnSuccess = filterContext.HttpContext.Request.Url.AbsolutePath; string redirectUrl = string.Format("?ReturnUrl={0}", redirectOnSuccess); string loginUrl = System.Web.Security.FormsAuthentication.LoginUrl + redirectUrl; filterContext.HttpContext.Response.Redirect(loginUrl, true); } } }
堆栈跟踪如下:
System.Web.HttpException: Cannot redirect after HTTP headers have been sent. at System.Web.HttpResponse.Redirect(String url, Boolean endResponse) at System.Web.HttpResponseWrapper.Redirect(String url, Boolean endResponse) at System.Web.Mvc.RedirectResult.ExecuteResult(ControllerContext context) at System.Web.Mvc.ControllerActionInvoker.InvokeActionResult(ControllerContext controllerContext, ActionResult actionResult) at System.Web.Mvc.ControllerActionInvoker.<>c__DisplayClass14.<InvokeActionResultWithFilters>b__11() at System.Web.Mvc.ControllerActionInvoker.InvokeActionResultFilter(IResultFilter filter, ResultExecutingContext preContext, Func`1 continuation) at System.Web.Mvc.ControllerActionInvoker.<>c__DisplayClass14.<>c__DisplayClass16.<InvokeActionResultWithFilters>b__13() at System.Web.Mvc.ControllerActionInvoker.InvokeActionResultWithFilters(ControllerContext controllerContext, IList`1 filters, ActionResult actionResult) at System.Web.Mvc.ControllerActionInvoker.InvokeAction(ControllerContext controllerContext, String actionName) 您所要做的就是覆盖HandleUnauthorizedRequest而不是OnAuthorization,只需将RedirectResult url分配给AuthorizationContext.Result即可.
base.OnAuthorization将检查身份验证,如果失败则调用HandleUnauthorizedRequest.
protected override void HandleUnauthorizedRequest(AuthorizationContext filterContext) { string redirectOnSuccess = filterContext.HttpContext.Request.Url.AbsolutePath; string redirectUrl = string.Format("?ReturnUrl={0}", redirectOnSuccess); filterContext.Result = new RedirectResult(redirectUrl); return; }

