Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/asp.net-mvc-3/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Asp.net mvc 3 asp.net mvc使用线程安全设置会话值_Asp.net Mvc 3_Session_Thread Safety - Fatal编程技术网

Asp.net mvc 3 asp.net mvc使用线程安全设置会话值

Asp.net mvc 3 asp.net mvc使用线程安全设置会话值,asp.net-mvc-3,session,thread-safety,Asp.net Mvc 3,Session,Thread Safety,在我的asp.net MVC项目中,我有一个会话助手类,用于设置和检索会话值。这是一节课: public class SessionManager { public static string UserName { get { return HttpContext.Current.Session[SessConstants.UName] ; } set {

在我的asp.net MVC项目中,我有一个会话助手类,用于设置和检索会话值。这是一节课:

public class SessionManager
{
     public static string UserName
    {
        get
        {
            return HttpContext.Current.Session[SessConstants.UName] ;
        }
        set
        {
            HttpContext.Current.Session[SessConstants.UName] = value;
        }
    }
}
如您所见,属性是静态的。我在我的代码中使用此选项,如下所示:

//For setting values    
SessionManager.UserName = "";

//For retrieving values
strLoggedinUser = SessionManager.UserName;
问题:

  • 对于设置为HttpContext.Current.Session['someVar'],这样的静态属性是线程安全的吗
  • 我是否应该创建一个实例属性,并在从MVC控制器类继承的基本控制器中实例化SessionManager。然后,我可以让我的所有控制器继承我的自定义控制器,而不是MVC控制器
  • 想法

    感谢您抽出时间……

    这里有一个想法。(可能不完全是对你问题的回答,但我认为Maess在评论中处理了这个问题。)

    与其使用单独的
    SessionManager
    类来封装会话状态变量,为什么不使用扩展方法呢

    public static class SessionExtensionMethods
    {
        private const string SessionUserNameKey = "UName";
    
        // set the session value (pass null to remove)
        public static void UserName(this HttpSessionStateBase session, string value)
        {
            if (value == null) session.Remove(SessionUserNameKey);
            else session[SessionUserNameKey] = value;
        }
    
        // get the session value
        public static string UserName(this HttpSessionStateBase session)
        {
            var value = session[SessionUserNameKey];
            return value != null ? value.ToString() : null;
        }
    }
    
    然后,在控制器中,可以执行以下操作以获取和设置会话值:

    // set the value
    Session.UserName("SomeUserName");
    
    // get the value
    var sessionUserName = Session.UserName();
    
    // clear the value 
    Sesssion.UserName(null);
    

    这里不需要基本控制器类。您需要做的就是确保控制器引用了
    SessionExtensionMethods
    类声明的命名空间

    如果您是从控制器基础或特定控制器实例使用SessionManager,那么线程安全不是问题,因为会为每个请求创建控制器的新实例,并且会话特定于该会话。但是,根据您在环境中使用的负载平衡方案,可能根本不建议使用会话。当前SessionManager位于帮助程序项目中。启用线程安全的步骤是:1.)使其成为具有实例属性的实例类;2.)使该类在从MVC控制器类继承的自定义基本控制器类中可用。因此,您的意思是,如果我将其按现在的方式移动到自定义控制器类,它将是线程安全的?即使属性是静态的?是的,因为每个控制器实例都是单独销毁和创建的,并且是当前线程的本地实例。基类只是一个基类,它不是在与实现它的控制器分离的上下文中执行的。请看:太好了,所以我收集到的信息是,将SessionManager按原样移动到控制器也将保证线程安全,但是当前处理它的方式,将其保留在helper项目中,将不..正确吗?