有一个ASP.Net MVC项目。在global.asax中有一个定义:
public class Application : System.Web.HttpApplication
{
public static ConcurrentDictionary<string, HttpSessionState> UserSessions = new ConcurrentDictionary<string, HttpSessionState>();
...
它在这样的LoginController中使用:
public class LoginController : BaseController
{
public ActionResult DoLogin(AuthorizationViewModel authorizationViewModel)
{
...
var session = System.Web.HttpContext.Current.Session;
Application.UserSessions.TryAdd(session.SessionID, session);
它工作得很好,但现在我必须添加一个新的程序集(类库项目)和替代的LoginController。此库正在启动时加载,而AlternativeLoginController正在Windsor容器中注册)。我是这样做的:
public class AlternativeLoginController : BaseController
{
public ActionResult DoLogin(AuthorizationViewModel authorizationViewModel)
{
...
var session = System.Web.HttpContext.Current.Session;
Application.UserSessions.TryAdd(session.SessionID, session);
原生DoLogin(在Web项目中)和我的(在额外的装配项目中)应该像我一样工作。 Native DoLogin工作正常,每个新用户都被添加到Application.UserSessions ConcurrentDictionary中而没有任何麻烦。但是,当调用我的DoLogin时,无论服务器上是否有授权用户,Application.UserSessions.Count都显示为0。当达到Application.UserSessions.TryAdd时,本机DoLogin授权的所有用户都将被未经授权。 这怎么可能?为什么公共静态Application.UserSessions在Web项目代码和附加汇编代码中的工作方式不同?
更新:我发现了这个错误。在我之前负责.dll的人添加了日志。在每次调用DoLogin时,他都将.xml格式的日志文件存储在... bin文件夹中。 TA-坝!由于bin文件夹被修改,服务器立即重新启动,所有会话都关闭,我看到一个空的Application.UserSessions。
答案 0 :(得分:2)
尝试使用HttpContext.Application对象存储您需要在Web应用程序中共享的对象。
https://msdn.microsoft.com/en-us/library/system.web.httpcontext.application(v=vs.110).aspx
您可以在Global.asax.cs
中进行设置Application.Set("UserSessions", new ConcurrentDictionary<string, HttpSessionState>())
您可以在MVC中使用它来获取UserSessions的实例
((ConcurrentDictionary<string, HttpSessionState>)HttpContext.Application.Get("UserSessions"))
当然,您将丢失应用程序回收中的内容。