在开发ASP.NET程序时,需要对相关数据进行缓存,缓存较多的主要是用户的身份信息,现提供几个对session操作较为常用的方法:
1.添加session,对设置对应的时间:
////// 添加Session,调动有效期为30分钟 /// /// Session对象名称 /// Session值 public static void Add(string strSessionName, string strValue) { HttpContext.Current.Session[strSessionName] = strValue; HttpContext.Current.Session.Timeout = 30; }
////// 添加Session,调动有效期为30分钟 /// /// Session对象名称 /// Session值数组 public static void Adds(string strSessionName, string[] strValues) { HttpContext.Current.Session[strSessionName] = strValues; HttpContext.Current.Session.Timeout = 30; }
////// 添加Session /// /// Session对象名称 /// Session值 /// 调动有效期(分钟) public static void Add(string strSessionName, string strValue, int iExpires) { HttpContext.Current.Session[strSessionName] = strValue; HttpContext.Current.Session.Timeout = iExpires; }
////// 添加Session /// /// Session对象名称 /// Session值数组 /// 调动有效期(分钟) public static void Adds(string strSessionName, string[] strValues, int iExpires) { HttpContext.Current.Session[strSessionName] = strValues; HttpContext.Current.Session.Timeout = iExpires; }
以上对session的添加操作中,主要是参数值的类型不同,以后后两种方式中,对session的有效时间进行滑动设置。
2.session的读取操作:
////// 读取某个Session对象值 /// /// Session对象名称 ///Session对象值 public static string Get(string strSessionName) { if (HttpContext.Current.Session[strSessionName] == null) { return null; } return HttpContext.Current.Session[strSessionName].ToString(); }
////// 读取某个Session对象值数组 /// /// Session对象名称 ///Session对象值数组 public static string[] Gets(string strSessionName) { if (HttpContext.Current.Session[strSessionName] == null) { return null; } return (string[])HttpContext.Current.Session[strSessionName]; }
3.session的删除操作:
////// 删除某个Session对象 /// /// Session对象名称 public static void Del(string strSessionName) { HttpContext.Current.Session[strSessionName] = null; }
session的操作中主要包含ID和Value,无论是写入还是读取,SessionId可以做唯一性标记。
4.HttpContext和HttpSessionState的源码如下:
////// 封装有关个别 HTTP 请求的所有 HTTP 特定的信息。 /// public sealed class HttpContext : IServiceProvider, IPrincipalContainer { ////// 使用指定的请求和响应对象初始化 /// 当前 HTTP 请求的类的新实例。 /// 对象。当前 HTTP 请求的 对象。 public HttpContext(HttpRequest request, HttpResponse response); /// /// 使用指定的辅助请求对象初始化 /// 当前 HTTP 请求的类的新实例。 /// 对象。 public HttpContext(HttpWorkerRequest wr); /// /// 接受一个使用指定的用户函数的 /// 用户函数。请求。 /// 参数为 null。 该请求不是一个 [TargetedPatchingOptOut("Performance critical to inline this type of method across NGen image boundaries")] public void AcceptWebSocketRequest(Func请求。 userFunc); /// /// 接受一个使用指定的用户函数和选项对象 /// 用户函数。 选项对象。请求。 /// 参数为 null。 该请求不是一个 public void AcceptWebSocketRequest(Func请求。 userFunc, AspNetWebSocketOptions options); /// /// 引发在请求的 HTTP 部件结束时发生的虚拟事件。 /// /// ////// 订阅标记。 /// /// HTTP 上下文对象。public ISubscriptionToken AddOnRequestCompleted(Action 参数为 null。 callback); /// /// 启动一个对象 /// ///方法的调用,当此请求 的连接部分完成时。 /// /// 订阅标记。 /// /// 当该请求的部分完成时其 方法必须被调用的对象。 public ISubscriptionToken DisposeOnPipelineCompleted(IDisposable target); /// /// 返回当前服务类型的对象。 /// /// ////// 如果找到服务,则为 /// 要将服务提供商设置为的;否则为 null。 /// 服务类型。 object IServiceProvider.GetService(Type service); /// /// 用于为请求指定处理程序。 /// /// 应处理请求的对象。public void RemapHandler(IHttpHandler handler); /// 方法是在发生 事件之后调用的。 /// 将异常添加到当前 HTTP 请求的异常集合中。 /// /// 要添加到异常集合中的。 public void AddError(Exception errorInfo); /// /// 清除当前 HTTP 请求的所有错误。 /// public void ClearError(); ////// 设置支持 HTTP 请求所需的会话状态行为的类型。 /// /// 枚举值之一,该值指定需要什么类型的会话状态行为。该方法在引发 public void SetSessionStateBehavior(SessionStateBehavior sessionStateBehavior); ///事件之后调用。 /// 为当前应用程序返回请求的配置信息。 /// /// ////// 包含配置信息的对象。 (在使用之前,将返回的配置节强制转换为适当的配置类型。) /// /// 为其请求信息的应用程序配置标记。 [Obsolete("The recommended alternative is System.Web.Configuration.WebConfigurationManager.GetWebApplicationSection in System.Web.dll. http://go.microsoft.com/fwlink/?linkid=14202")] public static object GetAppConfig(string name); ////// 为当前 HTTP 请求返回所请求的配置信息。 /// /// ////// 如果该节不存在,则为指定的 /// 为其请求信息的配置标记。 [Obsolete("The recommended alternative is System.Web.HttpContext.GetSection in System.Web.dll. http://go.microsoft.com/fwlink/?linkid=14202")] [TargetedPatchingOptOut("Performance critical to inline this type of method across NGen image boundaries")] public object GetConfig(string name); ///null,如果该节不能在运行时访问,则为一个内部对象。 (在使用之前,将返回的对象强制转换为适当的配置类型。) /// /// 获取当前应用程序的默认配置的指定配置节。 /// /// ////// 如果该节不存在,则为指定的 /// 配置节路径(使用 XPath 格式)和配置元素名称。 public object GetSection(string sectionName); ///null,如果该节不能在运行时访问,则为一个内部对象。 /// /// 使用给定路径重写 URL。 /// /// 内部重写路径。参数为 null。 [TargetedPatchingOptOut("Performance critical to inline this type of method across NGen image boundaries")] public void RewritePath(string path); /// 参数不在当前应用程序的根目录中。 /// 使用给定路径和一个布尔值重写 URL,该布尔值用于指定是否修改服务器资源的虚拟路径。 /// /// 内部重写路径。 如果重置虚拟路径,则为 true;如果保持虚拟路径不变,则为 false。参数为 null。 public void RewritePath(string path, bool rebaseClientPath); /// 参数不在当前应用程序的根目录中。 /// 使用给定的路径、路径信息和查询字符串信息重写 URL。 /// /// 内部重写路径。 资源的附加路径信息。 有关更多信息,请参见。 请求查询字符串。 参数不在当前应用程序的根目录中。 public void RewritePath(string filePath, string pathInfo, string queryString); /// 参数不在当前应用程序的根目录中。 /// 使用给定虚拟路径、路径信息、查询字符串信息和一个布尔值重写 URL,该布尔值用于指定是否将客户端文件路径设置为重写路径。 /// /// 服务请求的资源的虚拟路径。 用于 URL 重定向的附加路径信息。 有关更多信息,请参见。 用于 URL 重定向的请求查询字符串。 若要将用于客户端资源的文件路径设置为 参数的值,则为 true;否则为 false。 参数不在当前应用程序的根目录中。 public void RewritePath(string filePath, string pathInfo, string queryString, bool setClientFilePath); /// 参数不在当前应用程序的根目录中。 /// 根据指定的 /// ///和 属性,获取应用程序级别资源对象。 /// /// 一个 /// 一个字符串,表示所请求资源对象的,表示请求的应用程序级别资源对象;否则,如果未找到资源对象,或找到了资源对象但其没有请求的属性,则为 null。 /// 属性。 一个字符串,表示所请求资源对象的 属性。 未找到具有指定 [TargetedPatchingOptOut("Performance critical to inline this type of method across NGen image boundaries")] public static object GetGlobalResourceObject(string classKey, string resourceKey); ///参数的资源对象。 - 或 - 主程序集不包含非特定区域性的资源,而由于缺少相应的附属程序集,这些资源又是必需的。 /// 根据指定的 /// ///和 属性以及 对象,获取一个应用程序级别资源对象。 /// /// 一个 /// 一个字符串,表示所请求资源对象的,表示请求的应用程序级别资源对象(对指定区域性对其进行了本地化);否则,如果未找到资源对象,或找到了资源对象但其没有请求的属性,则为 null。 /// 属性。 一个字符串,表示所请求资源对象的 属性。 一个字符串,表示请求的资源的 对象。 未找到具有指定 public static object GetGlobalResourceObject(string classKey, string resourceKey, CultureInfo culture); ///参数的资源对象。 - 或 - 主程序集不包含非特定区域性的资源,而由于缺少相应的附属程序集,这些资源又是必需的。 /// 根据指定的 /// ///和 属性,获取页级别资源对象。 /// /// /// 本地资源对象的,表示请求的页级别资源对象;否则,如果找到了匹配的资源对象但不是 参数,则为 null。 /// 属性。 一个字符串,表示所请求资源对象的 属性。 未找到具有指定 参数的资源对象。 指定的 参数不在当前应用程序的根目录中。 未能找到页的资源类。 [TargetedPatchingOptOut("Performance critical to inline this type of method across NGen image boundaries")] public static object GetLocalResourceObject(string virtualPath, string resourceKey); ////// 根据指定的 /// ///和 属性以及 对象,获取一个页级别资源对象。 /// /// /// 本地资源对象的,表示请求的本地资源对象(针对指定区域性进行了本地化的对象);否则,如果找到了匹配的资源对象但不是 参数,则为 null。 /// 属性。 一个字符串,表示所请求资源对象的 属性。 一个字符串,表示所请求资源对象的 对象。 未找到具有指定 参数的资源对象。 指定的 参数不在当前应用程序的根目录中。 未能找到页的资源类。 public static object GetLocalResourceObject(string virtualPath, string resourceKey, CultureInfo culture); ////// 获取一个值,该值指示此请求是否是一个 /// ///请求。 /// /// 如果该请求是一 public bool IsWebSocketRequest { get; } ///请求,则为 true,否则为 false。 /// /// 获取指示连接是否从 HTTP连接升级到 /// ///连接的值。 /// /// 如果连接正在升级,则为 true;否则为 false。 /// public bool IsWebSocketRequestUpgrading { get; } ////// 获取客户要求的子协议列表的有序列表。 /// /// ////// 为请求的协议,或如果不是 public IList请求,或者列表不存在则为 null。 /// WebSocketRequestedProtocols { get; } /// /// 获取用于 /// ///连接而从服务器发送到客户端的协商协议。 /// /// 协商的协议。 /// public string WebSocketNegotiatedProtocol { [TargetedPatchingOptOut("Performance critical to inline this type of method across NGen image boundaries")] get; } ////// 为当前 HTTP 请求获取或设置 /// ///对象。 /// /// 当前 HTTP 请求的 public static HttpContext Current { get; set; } ///。 /// /// 获取或设置包含适用于异步预加载模式的标志的对象。 /// /// ////// 包含适用于异步预加载模式的标志的对象。 /// public AsyncPreloadModeFlags AsyncPreloadMode { get; set; } ////// 获取或设置一个值,此值指示 ASP.NET 请求处理过程中是否允许非预期的异步操作。 /// /// ////// 当异步 API 在不是预期的时间使用时 ASP.NET 将引发异常,则 false,否则为 true。 默认值为 false。 /// [EditorBrowsable(EditorBrowsableState.Advanced)] public bool AllowAsyncDuringSyncStages { get; set; } ////// 为当前 HTTP 请求获取或设置 /// ///对象。 /// /// 当前 HTTP 请求的 ///。 ASP.NET 使用 ApplicationInstance 代替 Application 作为属性名来指代当前的 实例,以避免 ASP.NET 与经典 ASP 之间产生混淆。 在经典 ASP 中,Application 指代全局应用程序状态字典。 /// Web 应用程序正在 IIS 7.0 集成模式下运行,并且已尝试将属性值从非 NULL 值更改为 null。 public HttpApplication ApplicationInstance { [TargetedPatchingOptOut("Performance critical to inline this type of method across NGen image boundaries")] get; set; } ////// 为当前 HTTP 请求获取 /// ///对象。 /// /// 当前 HTTP 请求的 public HttpApplicationState Application { get; } ///。 若要获取当前 HTTP 请求的 对象,请使用 。 (ASP.NET 使用 ApplicationInstance 代替 Application 作为属性名来指代当前的 实例,以避免 ASP.NET 与经典 ASP 之间产生混淆。 在经典 ASP 中,Application 指代全局应用程序状态字典。) /// /// 获取或设置负责处理 HTTP 请求的 /// ///对象。 /// /// 负责处理 HTTP 请求的 public IHttpHandler Handler { [TargetedPatchingOptOut("Performance critical to inline this type of method across NGen image boundaries")] get; set; } ///。 /// /// 获取父处理程序的 /// ///对象。 /// /// public IHttpHandler PreviousHandler { get; } ///实例,如果未找到上一个处理程序,则为 null。 /// /// 获取表示当前正在执行的处理程序的 /// ///对象。 /// /// 一个 public IHttpHandler CurrentHandler { get; } ///,表示当前正在执行的处理程序。 /// /// 获取当前 HTTP 请求的 /// ///对象。 /// /// 当前 HTTP 请求的 ///。 /// Web 应用程序正在 IIS 7 的“集成”模式下运行。 public HttpRequest Request { [TargetedPatchingOptOut("Performance critical to inline across NGen image boundaries")] get; } ////// 获取当前 HTTP 响应的 /// ///对象。 /// /// 当前 HTTP 响应的 ///。 /// Web 应用程序正在 IIS 7 的“集成”模式下运行。 public HttpResponse Response { [TargetedPatchingOptOut("Performance critical to inline across NGen image boundaries")] get; } ////// 为当前 HTTP 响应获取 /// ///对象。 /// /// 当前 HTTP 响应的 public TraceContext Trace { get; } ///。 /// /// 获取可用于在 HTTP 请求过程中在 /// ///接口和 接口之间组织和共享数据的键/值集合。 /// /// public IDictionary Items { get; } ///键/值集合,按指定的键提供对集合中个别值的访问。 /// /// 为当前 HTTP 请求获取 /// ///对象。 /// /// 当前 HTTP 请求的 public HttpSessionState Session { get; } ///对象。 /// /// 获取提供用于处理 Web 请求的方法的 /// ///对象。 /// /// 当前 HTTP 请求的 public HttpServerUtility Server { get; } ///。 /// /// 获取在处理 HTTP 请求的过程中累积的第一个错误(如果有)。 /// /// ////// 当前 HTTP 请求/响应过程的第一个 public Exception Error { get; } ///;如果在处理 HTTP 请求期间没有发生任何错误,则为 null。 默认值为 null。 /// /// 获取在处理 HTTP 请求的过程中累积的错误数组。 /// /// ////// 当前 HTTP 请求的 public Exception[] AllErrors { get; } ///对象数组。 /// /// 为当前 HTTP 请求获取或设置安全信息。 /// /// ////// 当前 HTTP 请求的安全信息。 /// public IPrincipal User { get; [TargetedPatchingOptOut("Performance critical to inline this type of method across NGen image boundaries"), SecurityPermission(SecurityAction.Demand, ControlPrincipal = true)] set; } ////// 获取当前用户配置文件的 /// ///对象。 /// /// 如果应用程序配置文件包含配置文件的属性的定义,则为 public ProfileBase Profile { get; } ///;否则为 null。 /// /// 获取或设置一个值,该值指定 /// ///对象是否应跳过对当前请求的授权检查。 /// /// 如果 public bool SkipAuthorization { [TargetedPatchingOptOut("Performance critical to inline this type of method across NGen image boundaries")] get; [TargetedPatchingOptOut("Performance critical to inline this type of method across NGen image boundaries"), SecurityPermission(SecurityAction.Demand, ControlPrincipal = true)] set; } ///应跳过授权检查,则为 true;否则为 false。 默认值为 false。 /// /// 获取一个值,该值指示当前 HTTP 请求是否处于调试模式。 /// /// ////// 如果请求处于调试模式,则为 true;否则,为 false。 /// public bool IsDebuggingEnabled { get; } ////// 获取一个值,该值指示是否已为当前 HTTP 请求启用自定义错误。 /// /// ////// 如果启用了自定义错误,则为 true;否则,为 false。 /// public bool IsCustomErrorEnabled { get; } ////// 获取当前 HTTP 请求的初始时间戳。 /// /// ////// 当前 HTTP 请求的时间戳。 /// public DateTime Timestamp { get; } ////// 获取当前应用程序域的 /// ///对象。 /// /// 当前应用程序域的 public Cache Cache { get; } ///。 /// /// 获取此要求的页检测服务实例的引用。 /// /// ////// 此请求的页检测服务实例。 /// public PageInstrumentationService PageInstrumentation { get; } ////// 获取或设置一个值,此值指示 ASP.NET 运行时是否应在请求超时时,调用为该请求提供服务的线程上的 /// ///。 /// /// true 如果 public bool ThreadAbortOnTimeout { get; set; } ///将调用,当线程时间;否则, false。 默认值为 true。 /// /// 获取一个 /// ///值,该值指示当前正在处理的 事件。 /// /// ///值之一。 /// 操作要求 IIS 7 处于集成管线模式,并且要求 .NET Framework 至少为 3.0 版本。 public RequestNotification CurrentNotification { get; internal set; } ////// 在 /// ///事件完成处理之后获取 ASP.NET 管道的当前进程点的值。 /// /// 如果启用了自定义错误,则为 true;否则,为 false。 /// ///操作要求 IIS 7 中的集成管线模式并且要求为 .NET Framework 3.0。 public bool IsPostNotification { get; internal set; } }
////// 提供对会话状态值以及会话级别设置和生存期管理方法的访问。 /// public sealed class HttpSessionState : ICollection, IEnumerable { ////// 取消当前会话。 /// public void Abandon(); ////// 向会话状态集合添加一个新项。 /// /// 要添加到会话状态集合的项的名称。要添加到会话状态集合的项的值。 public void Add(string name, object value); ////// 删除会话状态集合中的项。 /// /// 要从会话状态集合中删除的项的名称。 public void Remove(string name); ////// 删除会话状态集合中指定索引处的项。 /// /// 要从会话状态集合中移除的项的索引。public void RemoveAt(int index); /// 小于零。 - 或 - 等于或大于 。 /// 从会话状态集合中移除所有的键和值。 /// public void Clear(); ////// 从会话状态集合中移除所有的键和值。 /// [TargetedPatchingOptOut("Performance critical to inline this type of method across NGen image boundaries")] public void RemoveAll(); ////// 返回一个枚举数,可用来读取当前会话中所有会话状态的变量名称。 /// /// ////// public IEnumerator GetEnumerator(); ///可以循环访问会话状态集合中的变量名称。 /// /// 将会话状态值的集合复制到一维数组中(从数组的指定索引处开始)。 /// ///,它接收会话值。 中从零开始的索引,在此处开始复制。 public void CopyTo(Array array, int index); /// /// 获取会话的唯一标识符。 /// /// ////// 唯一会话标识符。 /// public string SessionID { get; } ////// 获取并设置在会话状态提供程序终止会话之前各请求之间所允许的时间(以分钟为单位)。 /// /// ////// 超时期限(以分钟为单位)。 /// public int Timeout { get; set; } ////// 获取一个值,该值指示会话是否是与当前请求一起创建的。 /// /// ////// 如果会话是与当前请求一起创建的,则为 true;否则,为 false。 /// public bool IsNewSession { get; } ////// 获取当前会话状态模式。 /// /// ////// public SessionStateMode Mode { get; } ///值之一。 /// /// 获取一个值,该值指示会话 ID 是嵌入在 URL 中还是存储在 HTTP Cookie 中。 /// /// ////// 如果会话嵌入在 URL 中,则为 true;否则,为 false。 /// public bool IsCookieless { get; } ////// 获取一个值,该值指示是否为无 Cookie 会话配置应用程序。 /// /// ////// 指示是否为无 Cookie 会话配置应用程序的其中一个 public HttpCookieMode CookieMode { get; } ///值。 默认值为 。 /// /// 获取或设置当前会话的区域设置标识符 (LCID)。 /// /// ////// 指定当前会话的区域性的 public int LCID { get; set; } ///实例。 /// /// 获取或设置当前会话的字符集标识符。 /// /// ////// 当前会话的字符集标识符。 /// public int CodePage { get; set; } ////// 获取对当前会话状态对象的引用。 /// /// ////// 当前 public HttpSessionState Contents { get; } ///。 /// /// 获取由 ASP.NET 应用程序文件 Global.asax 中的 <object Runat="Server" Scope="Session"/> 标记声明的对象的集合。 /// /// ////// 一个 public HttpStaticObjectsCollection StaticObjects { get; } ///,它包含在 Global.asax 文件中声明的对象。 /// /// 按名称获取或设置会话值。 /// /// ////// 具有指定名称的会话状态值;如果该项不存在,则为 null。 /// /// 会话值的键名。 public object this[string name] { get; set; } ////// 按数字索引获取或设置会话值。 /// /// ////// 存储在指定索引处的会话状态值;如果该项不存在,则为 null。 /// /// 会话值的数字索引。 public object this[int index] { get; set; } ////// 获取会话状态集合中的项数。 /// /// ////// 集合中的项数。 /// public int Count { get; } ////// 获取存储在会话状态集合中所有值的键的集合。 /// /// ////// 包含所有会话键的 public NameObjectCollectionBase.KeysCollection Keys { get; } ///。 /// /// 获取一个对象,该对象可用于同步对会话状态值的集合的访问。 /// /// ////// 可用于同步集合访问的对象。 /// public object SyncRoot { get; } ////// 获取一个值,该值指示会话是否为只读。 /// /// ////// 如果会话为只读,则为 true;否则为 false。 /// public bool IsReadOnly { get; } ////// 获取一个值,该值指示对会话状态值的集合的访问是否是同步(线程安全)的。 /// /// ////// 如果对该集合的访问是同步的(线程安全),则为 true;否则,为 false。 /// public bool IsSynchronized { get; } }
注:较多的.net程序员在项目开发和学习中,较少去直接查看.net提供的源码,在查看源码的过程中,会发现该类实现的一些接口和继承的抽象类,有助于我们更好的了解该类的特性。