默认情况下,Session状态依赖Cookie,ASP.NET Framework利用ASP.NET_SessionId这个Cookie来识别跨页面请求的用户,
这样正确的数据就能关联到正确的用户。如果浏览器中禁用了Cookie,Session状态就不能工作了。
如果希望cookie被禁用时,Session状态还是能工作,就应该使用无Cookie的会话。当启用无Cookie的会话时,用户的会话ID 添加到页面的URL中。
可以修改Web配置文件的sessionState元素,启用无Cookie的会话。sessionState元素包含一个cookieless特性,
它接受下面的值:
AutoDetect 当浏览器启用cookie时,会话ID保存在cookie中,否则,会话ID添加到URL。
UseCookies 会话ID总是被存于cookie(默认值)
UseDeviceProfile 当浏览器支持cookie时,会话ID存于cookie,否则,会话ID添加到URL
UseUri 会话ID总是添加到URL。
当设置cookieless的值为UseDeviceProfile时,ASP.NET Framework 通过位于下面文件夹的一组文件查询浏览器是否支持cookie
C:\WINDOWS\Microsoft.NET\Framework\v2.050727\Config\Browsers
根据这些文件,如果浏览器支持cookie,则使用cookie存储会话ID。即使浏览器禁用了cookie,框架还是会试图添加cookie。
当cookiesless被设置为AutoDetect时,框架检查HTTP cookie 头部是否存在。如果cookie头部被检测到,则框架在cookie中存储会话ID,
否则,将会话ID添加到页面URL中。
以下例子 在Web配置文件中给cookieless特性设置了值AutoDetect,以启用无cookie的会话
<configuration>
<system.web>
<sessionStatcookieless="AutoDetect"regenerateExpiredSessionId="true"/>
<system.web>
</configuratio>
注意:上述代码中还包含了一个regenerateExpiredSessionId特性。当启用无cookie的会话状态时,就应该启用该特性,因为它能帮助用户避免不小心共享Session状态。
当启用无cookie的会话,并在用用程序的页面间连接时,需要注意尽量使用相对URL。否则,会话ID不能自动添加到URL。
例如: 尽量使用 /Home/Page.aspx
不要用用 http://xxxx/Home/Page.aspx
如果出于某些原因需要使用觉得URL,则使用Response.ApplyAppPathModifier()方法添加会话ID到URL。该方法接受一个绝对URL,返回一个嵌入了会话ID的URL。