Answers:
(为了完整性起见,已更新)
您可以使用Session["loginId"]
以及从任何类(例如,从类库内部)使用来访问任何页面或控件中的会话变量System.Web.HttpContext.Current.Session["loginId"].
但请继续阅读我的原始答案...
我总是在ASP.NET会话周围使用包装器类,以简化对会话变量的访问:
public class MySession
{
// private constructor
private MySession()
{
Property1 = "default value";
}
// Gets the current session.
public static MySession Current
{
get
{
MySession session =
(MySession)HttpContext.Current.Session["__MySession__"];
if (session == null)
{
session = new MySession();
HttpContext.Current.Session["__MySession__"] = session;
}
return session;
}
}
// **** add your session properties here, e.g like this:
public string Property1 { get; set; }
public DateTime MyDate { get; set; }
public int LoginId { get; set; }
}
此类在ASP.NET会话中存储自身的一个实例,并允许您从任何类中以类型安全的方式访问会话属性,例如:
int loginId = MySession.Current.LoginId;
string property1 = MySession.Current.Property1;
MySession.Current.Property1 = newValue;
DateTime myDate = MySession.Current.MyDate;
MySession.Current.MyDate = DateTime.Now;
这种方法有几个优点:
通过线程HttpContext访问会话:
HttpContext.Current.Session["loginId"]
建议的解决方案存在的问题是,如果您使用进程外会话存储,则会破坏SessionState内置的某些性能功能。(“状态服务器模式”或“ SQL Server模式”)。在oop模式下,会话数据需要在页面请求的末尾进行序列化,并在页面请求的开始进行反序列化,这可能会导致开销很大。为了提高性能,SessionState尝试仅对第一次访问时仅反序列化的变量进行反序列化,并且仅重新序列化并替换已更改的变量。如果您有很多会话变量并将它们全部推入一个类,则实际上,在使用该会话的每个页面请求中,会话中的所有内容都会反序列化,并且即使仅更改了一个属性(因为该类已更改),所有内容都需要再次序列化。如果您使用大量会话和oop模式,则只需考虑一下。
我面前提出的答案为该问题提供了适当的解决方案,但是,我认为了解此错误的原因很重要:
所述Session
的属性Page
返回类型的实例HttpSessionState
相对于该特定的请求。Page.Session
实际上等同于调用Page.Context.Session
。
MSDN解释了这是怎么可能的:
由于ASP.NET页包含对System.Web命名空间的默认引用(包含
HttpContext
类),因此您可以HttpContext
在.aspx页上引用成员,而无需完全限定类引用HttpContext
。
但是,当您尝试在App_Code的类中访问此属性时,该属性将对您不可用,除非您的类是从Page Class派生的。
我对这种经常遇到的情况的解决方案是,我永远不会将页面对象传递给class。我宁愿从Session页面提取所需的对象,并根据情况将它们以名称-值集合/数组/列表的形式传递给Class。
在asp.net核心中,这有不同的工作方式:
public class SomeOtherClass
{
private readonly IHttpContextAccessor _httpContextAccessor;
private ISession _session => _httpContextAccessor.HttpContext.Session;
public SomeOtherClass(IHttpContextAccessor httpContextAccessor)
{
_httpContextAccessor = httpContextAccessor;
}
public void TestSet()
{
_session.SetString("Test", "Ben Rules!");
}
public void TestGet()
{
var message = _session.GetString("Test");
}
}
资料来源:https : //benjii.me/2016/07/using-sessions-and-httpcontext-in-aspnetcore-and-mvc-core/
这对于应用程序和开发人员来说都应该更加有效。
将以下类添加到您的Web项目:
/// <summary>
/// This holds all of the session variables for the site.
/// </summary>
public class SessionCentralized
{
protected internal static void Save<T>(string sessionName, T value)
{
HttpContext.Current.Session[sessionName] = value;
}
protected internal static T Get<T>(string sessionName)
{
return (T)HttpContext.Current.Session[sessionName];
}
public static int? WhatEverSessionVariableYouWantToHold
{
get
{
return Get<int?>(nameof(WhatEverSessionVariableYouWantToHold));
}
set
{
Save(nameof(WhatEverSessionVariableYouWantToHold), value);
}
}
}
这是实现:
SessionCentralized.WhatEverSessionVariableYouWantToHold = id;