asp.net mvc设置具有线程安全性的会话值

时间:2012-04-10 17:42:11

标签: 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
        {
            HttpContext.Current.Session[SessConstants.UName] = value;
        }
    }
}

正如您所看到的,属性是静态的。我在我的代码中使用它如下:

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

//For retrieving values
strLoggedinUser = SessionManager.UserName;

问题:

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

    感谢您的时间......

1 个答案:

答案 0 :(得分:1)

这是一个想法。 (可能不完全是你问题的答案,但我认为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类的名称空间。