我希望我的MVC应用程序检查(在每个请求中)当前用户是否有个人资料。如果找不到配置文件,我想将它们重定向到“配置文件”页面,以便他们提交一个。
protected void Application_AuthenticateRequest()
{
if (HttpContext.Current.User != null)
{
// Redirect to profile page if the current user does not have a profile
if (!HttpContext.Current.User.HasProfile())
Response.RedirectToRoute("Profile");
}
}
我已经扩展了IPrincipal以包含一个方法“User.HasProfile()”来检查用户是否有个人资料。它有效,但问题是每个请求都会调用Application_AuthenticateRequest,包括javascript,css等......
此外,当我尝试执行Response.RedirectToRoute(“Profile”)时,它会创建一个重定向循环。
我找到的唯一方法是在重定向到个人资料页面之前将以下内容添加到我的IF语句中:
!HttpContext.Current.User.HasProfile() && Request.Path != "/system/profile" && !Request.Path.Contains(".")
它检查当前路径是否不是配置文件页面(以防止重定向循环)以及URL中是否有句点(允许javascript和css资源继续加载)。 有更好的方法吗?你们怎么处理这个?
答案 0 :(得分:3)
我不确定这是否适用于每一个案例,但我发现你可以查询当前上下文的Handler属性,而对静态资源它是null。
void LogRequestInfo(object sender, EventArgs e)
{
HttpApplication app = (HttpApplication)sender;
HttpContext ctx = app.Context;
// We don't want to spend resources logging static file requests. This code was added when we moved
// to Integrated mode in IIS.
if (ctx.Handler == null)
return;
// More code below here...
}