gpt4 book ai didi

c# - session 过期时, session 管理器不会注销我,HTTPContext.Current 为 Null

转载 作者:行者123 更新时间:2023-11-30 22:04:49 24 4
gpt4 key购买 nike

我当前的 session 管理器存在这个问题,当 session 过期时它不会注销用户。

在用户登录时,HttpContext.CurrentNULL,导致网站生成许多错误。我尝试了几种技术来在 session 过期时将用户重定向到登录,但没有成功。

  1. Global.asax 下,我正在使用 Session_End 可以尝试调用 LogOut 方法,但这甚至会在用户登录之前执行在.
  2. Global.asax 下,我添加了 Application_AcquireRequestState,但遗憾的是,这让许多对 SSO 服务的调用成为可能。此外,它永远不会在 session 过期时重定向到登录。我使用以下 FormsAuthentication.RedirectToLoginPage() 对其进行了测试;运气不好。

我通过 Lex Li 找到了这个答案“Why HttpContext.Current be null? ” - 它让我对我的问题可能是什么有了一些了解,即使我的应用程序没有使用后台线程,我的 HttpContext.Current 返回 Null 并带有一些随机请求,并不总是发生。

session 管理器

   public class SessionManager
{
private const string SessionKey = "AppSession";

private SessionManager()
{
GUID = new Guid();
FirstName = String.Empty;
LastName = String.Empty;
Email = String.Empty;
SessionExpiration = new DateTime();
}

// Gets the current session.
public static SessionManager Current
{
get
{
if(HttpContext.Current != null)
{
if (HttpContext.Current.Session[SessionKey] == null)
{
var model = new SessionManager();
HttpContext.Current.Session[SessionKey] = model;
}
return (SessionManager)HttpContext.Current.Session[SessionKey];
}
else
{
return null;
}
}

}

public static void LogOffUser()
{
//SSO is a seperate service, I need to stay insync.
var ssoAuth = new SSOAuth();
if(Current != null)
ssoAuth.SSOLogoffUser(Current.GUID);

FormsAuthentication.SignOut();
FormsAuthentication.RedirectToLoginPage();
}

public Guid GUID { get; set; }
public string FirstName { get; set; }
public string LastName { get; set; }
public string Email { get; set; }
public DateTime SessionExpiration { get; set; }
}

登录 Controller

[HttpPost]
[AllowAnonymous]
public JsonResult Login(LoginViewModel user)
{
var ssoAuth = new SSOAuth();
var sessionObject = ssoAuth.SSOLoginUser(user.Email, user.Password);

if (sessionObject != null && sessionObject.SessionId != Guid.Empty)
{
SessionManager.Current.Email = sessionObject.UserId;
SessionManager.Current.GUID = sessionObject.SessionId;
SessionManager.Current.FirstName = sessionObject.FirstName;
SessionManager.Current.LastName = sessionObject.LastName;
SessionManager.Current.SessionExpiration = sessionObject.SessionExpiration;

//Grab difference in time to get session timeout in minutes.
var differenceInTime = SessionManager.Current.SessionExpiration - DateTime.Now;
Session.Timeout = differenceInTime.Minutes;

//Authenticate user
FormsAuthentication.SetAuthCookie(user.Email, false);

//We return JSON, Its an AJAX Call.
return Json(new
{
redirectUrl = "/Home.mvc/Home/Index",
isRedirect = true
});
}

return Json(new
{
redirectUrl = string.Empty,
isRedirect = false
});
}

最佳答案

如评论中所确认,您将应用程序池的最大工作进程数设置为大于 1 的值并使用进程内模式 用于 session 状态。

我很确定这是 HttpContext.Current.Session 随机为 null 而不是 HttpContext.Current 的问题。

InProc session 状态和多个工作进程 不兼容。使用 InProc session 状态,您的 session 状态存储在工作进程内存中并且不在工作进程之间共享 => 这会导致 session 状态在处理您的请求时随机丢失通过不同的过程。

在您的情况下,将 Maximum number of worker processes 设置为 1 应该可以解决问题。

enter image description here

如果您正在寻找多工作进程解决方案,您应该使用 session 状态服务或数据库将 session 状态存储在进程外:http://tutorials.csharp-online.net/ASP.NET_State_Management%E2%80%94Storing_Session_State_out_of_Process

关于c# - session 过期时, session 管理器不会注销我,HTTPContext.Current 为 Null,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24868515/

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