Asp.net mvc 3 asp.net mvc使用线程安全设置会话值
在我的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 {
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;
问题:
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项目中,将不..正确吗?