我有这样的场景:
ASP.NET表单WebForm1.aspx
,其中包含WebForm2.aspx
的iFrame,以及用于跟踪当前SessionId
的代码。
ASP.NET表单WebForm2.aspx
,其中包含用于跟踪当前SessionId
。
正如某人here建议的那样,我会在每个页面加载中执行此操作,并在Global.asax
(Session_Start)中执行此操作:
Session["dummy"] = "dummy";
web.config的配置如下:
出于测试目的,我创建了两个Windows窗体应用程序,它们执行以下操作:
1)从一个WebBrowser控件中调用WebForm1.aspx 10次。
2)从10个不同的WebBrowser控件中调用WebForm1.aspx,每次一次。
结果是:
1)WebForm1和WebForm2中的SessionId始终相同。
2)生成多个SessionId:
Form1: ixbahucx3wmii452xlgserk5
Form1: wqh5dwsyovnnwclkfvanlj30
Form1: vddeexb1bfmo4uqw5qjdjol4
Form1: bavcxrgtaz5hvzswlabnuefy
Form1: v2rhzfjwoptmhfpbm2qzzfgh
Form1: pjtiez5dmxldfoojmflsbf1u
Form1: znf0qq41bmsccbjqcdpulefp
Form1: bml5vvj13c22yj0agfua5gyk
Form1: lzdufc3y55tqci0gtfgmpq33
Form1: nch1bocb0obw3tfi0rnz4fa4
Form2: v2rhzfjwoptmhfpbm2qzzfgh
Form2: v2rhzfjwoptmhfpbm2qzzfgh
Form2: znf0qq41bmsccbjqcdpulefp
Form2: znf0qq41bmsccbjqcdpulefp
Form2: lzdufc3y55tqci0gtfgmpq33
Form2: lzdufc3y55tqci0gtfgmpq33
Form2: nch1bocb0obw3tfi0rnz4fa4
Form2: nch1bocb0obw3tfi0rnz4fa4
Form2: nch1bocb0obw3tfi0rnz4fa4
Form2: v2rhzfjwoptmhfpbm2qzzfgh
WebForm1中的某些SessionId在WebForm2中没有对应的一个是什么原因?
答案 0 :(得分:1)
ASP.NET使用cookie来保留SessionId。
当请求已包含ASP.NET_SessionId
cookie时,ASP.NET使用来自cookie的会话ID值来恢复(或者,如果超时,则创建,以便在服务器端创建会话对象)。
当请求不包含ASP.NET_SessionId
cookie时,ASP.Net会创建新的Session对象,为其生成新的会话ID,并发送带有响应的会话ID值的Set-Cookie
标头。
所以基本上如果浏览器已经设置了cookie值,或者已经处理了前一个响应中的Set-Cookie
标题,它将使用它来发送下一个请求,而且旧的'会话将被重用;否则将创建新会话。
案例1表明这非常好。
案例2更复杂,但看起来你同时启动所有10个请求,浏览器控件共享相同的cookie存储。
前十个请求会生成十个完全不同的会话,因为他们没有设置Cookie:
(1) Form1: ixbahucx3wmii452xlgserk5
(2) Form1: wqh5dwsyovnnwclkfvanlj30
(3) Form1: vddeexb1bfmo4uqw5qjdjol4
(4) Form1: bavcxrgtaz5hvzswlabnuefy
(5) Form1: v2rhzfjwoptmhfpbm2qzzfgh
(6) Form1: pjtiez5dmxldfoojmflsbf1u
(7) Form1: znf0qq41bmsccbjqcdpulefp
(8) Form1: bml5vvj13c22yj0agfua5gyk
(9) Form1: lzdufc3y55tqci0gtfgmpq33
(10) Form1: nch1bocb0obw3tfi0rnz4fa4
接下来,逐个请求开始响应服务器,每个请求都包含Set-Cookie
标头(因为所有请求都没有SessionID cookie)。这些Set-Cookie
中的每个新内容都会覆盖之前的Form2
,浏览器将使用新设置的sessionId从iframe请求(11) Form2: v2rhzfjwoptmhfpbm2qzzfgh
(12) Form2: v2rhzfjwoptmhfpbm2qzzfgh
。一个接一个地在下面:
收到(5)的回复,在下次回复之前发送了2个请求:
(13) Form2: znf0qq41bmsccbjqcdpulefp
(14) Form2: znf0qq41bmsccbjqcdpulefp
收到(7)的回复,在下次回复之前发送了2个请求:
(15) Form2: lzdufc3y55tqci0gtfgmpq33
(16) Form2: lzdufc3y55tqci0gtfgmpq33
收到(9)的回复,在下次回复之前发送了2个请求:
(17) Form2: nch1bocb0obw3tfi0rnz4fa4
(18) Form2: nch1bocb0obw3tfi0rnz4fa4
(19) Form2: nch1bocb0obw3tfi0rnz4fa4
收到(10)的回复,在下次回复之前发送了3个请求:
(20) Form2: v2rhzfjwoptmhfpbm2qzzfgh
此请求在回复(5)后发送,但刚刚收到回复:
{{1}}