gpt4 book ai didi

c# - 在 mvc4 中的 Global.asax session 超时时重定向

转载 作者:行者123 更新时间:2023-11-30 15:30:54 26 4
gpt4 key购买 nike

我试图检测 session 何时结束,然后在我的全局 asax 文件中完成后将用户重定向到主页。

我正在使用我发现的以下代码 here

全局.asax:

protected void Session_Start()
{
if (Context.Session != null)
{
if (Context.Session.IsNewSession)
{
string sCookieHeader = Request.Headers["Cookie"];
if ((null != sCookieHeader) && (sCookieHeader.IndexOf("ASP.NET_SessionId") >= 0))
{
//intercept current route
HttpContextBase currentContext = new HttpContextWrapper(HttpContext.Current);
RouteData routeData = RouteTable.Routes.GetRouteData(currentContext);


//Substitute route Data Token Values for the Area
routeData.DataTokens["area"] = "";
routeData.DataTokens["UseNamespaceFallback"] = true;


//substitute route values
routeData.Values["controller"] = "home";
routeData.Values["action"] = "index";
routeData.Values.Add("timedOut", "true");
//routeData.Values["id"] = "timedOut";

IRouteHandler routeHandler = routeData.RouteHandler;
RequestContext requestContext = new RequestContext(currentContext, routeData);

IHttpHandler httpHandler = routeHandler.GetHttpHandler(requestContext);
httpHandler.ProcessRequest(Context);

Response.Flush();
Response.End();
}
}
}
}

我认为它可以在开发环境中运行,但当我在我的服务器 (IIS7) 上尝试它时,我收到以下错误。

'HttpContext.SetSessionStateBehavior'只能在'HttpApplication.AcquireRequestState'之前被调用

我已经使用 here 等链接确定了问题但我就是无法让它工作。我认为问题出在下面几行

IHttpHandler httpHandler = routeHandler.GetHttpHandler(requestContext);
httpHandler.ProcessRequest(Context);

但是我似乎无法让它在服务器上运行。有什么想法或建议吗?

最佳答案

你可以为你的 Controller 制作一个自定义的 Action 过滤器来处理这个:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using System.Reflection;


namespace Web {


public class SessionExpireFilterAttribute : ActionFilterAttribute {


public override void OnActionExecuting( ActionExecutingContext filterContext ) {
HttpContext ctx = HttpContext.Current;


// check if session is supported
if ( ctx.Session != null ) {


// check if a new session id was generated
if ( ctx.Session.IsNewSession ) {


// If it says it is a new session, but an existing cookie exists, then it must
// have timed out
string sessionCookie = ctx.Request.Headers[ "Cookie" ];
if ( ( null != sessionCookie ) && ( sessionCookie.IndexOf ( "ASP.NET_SessionId" ) >= 0 ) ) {


ctx.Response.Redirect ( "~/Home/Login" );
}
}
}


base.OnActionExecuting ( filterContext );
}
}
}

然后,我会将此过滤器应用于我的 Controller 操作方法,如下所示:

 using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using System.Web.Mvc.Ajax;

namespace Web.Controllers {

public class HomeController : Controller {

[SessionExpireFilter]
public ActionResult Index( ) {
// This method will not execute if our session has expired

// render Home Page
return View();
}

public ActionResult Login() {
// render Login page
return View();
}
}
}

关于c# - 在 mvc4 中的 Global.asax session 超时时重定向,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21462167/

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