C# 中对 Session 的“(string)”、“.ToString()”与“Convert.ToString”用法笔记:
在实际操作当中,我们经常会遇到将 Session 的值转为 String 去判断是否为空或者判断是否有权限访问某页,这里的转换过程如果用得不恰当会抛出异常,给访问者带来不好的用户体验。这里我把它写成笔记,以供参考。
当 Session["a"] == null 时,Session["a"].ToString() 抛出异常;(string)Session["a"] 为 null;Convert.ToString(Session["a"]) 为 ""。
当 Session["a"] == "" 时,它们的值都为" "。所以,在判断 Session["a"] 是否有值时,如果用“.ToString()”,那么必需按照下面的格式与顺序写:if (Session["a"] != null && Session["a"].ToString() != "")
同理 if (Session["a"] == null || Session["a"].ToString() == "") 此句也合法可用。用 .ToString() 的方法写格式比较固定,如果换成用 (string) 写,会比较自由:
if ((string)Session["a"] != null && (string)Session["a"] != "") if (Session["a"] != null && (string)Session["a"] != "")
这两种写法都是可行的,而且对 null 和 empty 的判断顺序没有关系。
最简单的方法就是用 Convert.ToString:
if (Convert.ToString(Session["aaa"]) == "") 不管 Session["a"] 为 null 还是 empty,Convert.ToString(Session["aaa"]) 都是 empty 。
对于一个传统的客户机/服务器解决方案,例如一个基于客户机的应用程序对一个基于服务器的数据库引擎进行访问的系统,每个客户端建立了一个与服务器和数据库应用程序的连接。这种连接通常是通过验证用户的方法来建立的,当一台WWW服务器运行时,可能有若干个用户浏览正在运正在这台服务器上的网站。当每个用户首次与这台WWW服务器建立连接时,他就与这个服务器建立了一个Session,同时服务器会自动为其分配一个SessionID,用以标识这个用户的唯一身份。这个SessionID是由WWW服务器随机产生的一个由24个字符组成的字符串。会话ID是一种唯一标识当前访问服务器的客户的只读值。在经典的ASP环境下,会话ID是按照顺序方式被分配的,也就是说,会话ID 706616433之后跟着会话 ID 706616434等等。传统的ASP会话ID以加密的、非持久存在的cookie形式保存在客户机上。例如,会话ID 706616434就可能作为cookie ASPSESSIONIDGQQGQGCS=JHMBOBKCBINEHLPKJHOPABBE保存在客户机上。
事实上,当浏览器向服务器发送 Cookie 信息时,浏览器并未将过期信息包括在内。您可以读取 Expires 属性,但总是返回为零的日期/时间值。
当用户请求一个ASP网页时,IIS通过实例化asp.dll(用来实现ASP)创建一个环境(如第1章所述)。将该页面解释为服务器端脚本,相应的脚本引擎的实例用来执行该脚本。实例化的asp.dll初如事件启动一个ASP应用程序,创建一个Application对象。然后,为这个用户启动一个会话,并创建单独的Session 对象。当更多的会话启动时,这个Application对象保留在作用域中(即已经实例化和可用)。一旦最后保持活动的会话结束,该应用程序就结束,并取消相应的Application对象。
如果不设置过期时间,则表示这个cookie生命周期为浏览器会话期间,只要关闭浏览器窗口,cookie就消失了。这种生命期为浏览会话期的cookie被称为会话cookie。会话cookie一般不保存在硬盘上而是保存在内存里。如果设置了过期时间,浏览器就会把cookie保存到硬盘上,关闭后再次打开浏览器,这些cookie依然有效直到超过设定的过期时间。存储在硬盘上的cookie可以在不同的浏览器进程间共享,比如两个IE窗口。而对于保存在内存的cookie,不同的浏览器有不同的处理方式。