ASP.NET Session State
是在那个时候使用:
应用程序状态,存储可以访问一个ASP.NET应用程序的所有用户的变量.
Profile属性,在数据存储中持续用户变量不会过期.
ASP.NET caching,存储一个值在内存中让使用的ASP.NET应用程序使用
查看state,在页面上持续值.
Cookies.
使用给HTTP请求在一个HTML上查询字符和域.
Session变量被存储在一个SeesionStateItemCollection对象同过HttpContext.Session属性类暴露.在一个ASP.NET页面上,当前的session变量是通过Page对象的Session暴露出来的.
session变量的集合被变量名或一个integer index所索引.Session变量的创建是以来Session的变量名.你不声明一个session变量或明确添加进集合中.下面的事例显示怎样创建session变量.
Session["FirstName"] = FirstNameTextBox.Text;
Session["LastName"] = LastNameTextBox.Text;
其实Session变量能是任何.NET Framework的类型.下面谈的是存储一个ArraryList对在session变量.名为StockPicks.变量返回值是当你从SessionStateItemCollection中找到它时,StockPicks session变量必须被给出适当的类型.
ArrayList stockPicks = (ArrayList)Session["StockPicks"];
// Write the modified stock picks list back to session state.
Session["StockPicks"] = stockPicks;
// Write the modified stock picks list back to session state.
Session["StockPicks"] = stockPicks;
Cookieless SessionIDs
SessionID值是被存储在浏览中cookie中未过期的session.但你能指定一个seesion不存储在一个cookie中,你可以在Web.config中设置session state的cookieless属性.为true.
<configuration>
<system.web>
<sessionState cookieless="true"
regenerateExpiredSessionId="true" />
</system.web>
</configuration>
<system.web>
<sessionState cookieless="true"
regenerateExpiredSessionId="true" />
</system.web>
</configuration>
ASP.NET 就会维持一个非cookie 的session state,按照自动插入一个唯一session ID进入页面的URL.下面URL将你的ASP.NET的唯一session ID改为:lit3py55t21z5v55vlm25s55:
http://www.example.com/(S(lit3py55t21z5v55vlm25s55))/orderform.aspx
当ASP.NET发送一个页面到浏览器,修改任何页面连接,使用一个应用程序相关路径中嵌入session ID value.如此修改后Session state就能持续很长时间.可是,如果客户端提供应用程序重写URL.ASP.NET可能不能确保sessionID能取到当前的session.
当seession ID被嵌入URL之后消除应用程序名和之前保留文件和虚拟路径标记.授权ASP.NET在请求中执行SessionStateModule之前去溶入应用程序名.
Regenerating Expired Session Identifiers
在session ID值被使用在cookieless sessions中被反复使用.如果一个请求制造一个SessionID值已经过期,一个新的session开被SessionID值所使用来提供给这个请求.当一个包括cookieless SessionID值的连接被多个浏览器使用时这个能让结果在一个session无意中被分享.(如果连接通过 a search engine, an e-mail message, or another program这种情况就会触发)你能通过应用程序的配置来来减少这session数据被共享的机会.设置sessionState配置文件中的regenerateExpiredSessionID属性设置为true.这样当一个cookieless session请对过期session ID时就会产生一个新的session ID.
Custom Session Identifiers
你能时下思念一个自定义类提供和验证SessionID值.这样做创建一个类能继承SessionIDManager类和重写CreateSessionID和Validate方法.
你能创建一个类实现ISessionIDManager接口取代SessionIDManager类.例如.你能在Web Application结合使用一个ISAPI过滤,过滤一个非ASP.NET页面(非HTML页面或images)上的唯一标记.你能使用自己定义 SessionIDManager类来为ASP.NET session state定义唯一标记.如果你的自定义类支持cookieless session 标记,你必须为在URL中发送session和接收session标记实现一个解决.
Session Modes
ASP.NET session state 支持为session变量几个存储选项,每一个选项标识是一个session-state Mode 类型.默认行为是存储session变量在ASP.NET工作者的进程的内存储空间中.你还能指定session state存储在分离的进程中,在一个SQL Server 数据库中,或在自定义数据源.如果你不要这样的session state授权到你的应用程序,你可以设置session mode 为Off.
Session Events
ASP.NET提供两事件来帮助管理你的sessions.这个Session_OnStart事件是控制当一个session开始时被调用,并且Session_OnEnd事件是在当session被放弃或过期时调用.Session 事件被指定在Global.asax文件里面.
如果session Mode属性被设置为非InProc,InProc是默认mode,这个Session_OnEnd事件不被支持.
Configuring Session State
Session state 可以使用system.web配置部分的sessionState元素来配置.你能还能使用在@Page中的EnableSessionState来配置session state.
这个sessionState元素授权你指定下面选项:
是在session存储数据方式.
session标记值在服务端与客户端之间发送的方式.
session超时值.
支持基于session Mode设置值.
下面实现配置sessionState:
<sessionState mode="SQLServer"
cookieless="true "
regenerateExpiredSessionId="true "
timeout="30"
sqlConnectionString="Data Source=MySqlServer;Integrated Security=SSPI;"
stateNetworkTimeout="30"/>
cookieless="true "
regenerateExpiredSessionId="true "
timeout="30"
sqlConnectionString="Data Source=MySqlServer;Integrated Security=SSPI;"
stateNetworkTimeout="30"/>
你能不授权session state,只要设置sesssion-state mode为Off.若你只是需要对应用程序的一个页面不授权session state.你能设置EnableSessionState值为false,EnableSessionState值还能设置为ReadOnly.是提供read-only访问session 变量.
Concurrent Requests and Session State
访问ASP.NET session state独占每一个session,就是如果两不同的用户产生并发请求,访问每一个单独的session被认为是并发.可是,如果两个并发请求产生同一个session,(使用同一个sessionID值),在首先请求的首先得到唯一访问session信息.第二个请求执行的只能在第一个去请求访问结束后得到(第二个session才能得到访问.因为如果第一次请求已经超时,锁住信息就被释放.)如果在@Page中的EnableSessionState设置为ReadOnly,一个请求read-only session的信息,在锁住Session数据时没有返回结果,可是,read-only请求session数据也许仍然在等待一个已琐的read-write请求的session 数据被清出.