在ASP.NET中,我遇到了一种奇怪的情况:每次用户代理刷新页面时都会触发Session_Start
。由于会话应该已经开始,我无法理解为什么(这一台机器)每次点击都会触发Session_Start
。
浏览器正在发送cookie作为HTTP请求的一部分:
GET http://example.com/ HTTP/1.1
Accept: text/html, application/xhtml+xml, */*
Accept-Language: en-US
Accept-Encoding: gzip, deflate
...
Cookie: ASP.NET_SessionId=zsdntozy30cwvirc3lpnxh55
Cookie存在于http 请求标头中,但它导致创建新会话。但实际上,新的Cookie
没有被发送到客户端(通过Set-Cookie
响应标头)。
我假设如果会话cookie ASP.NET_SessionId=zsdntozy30cwvirc3lpnxh55
无效(例如由于应用程序池循环或web服务器重启),那么服务器应该 set
一个新的Cookie。
为了测试这个,我制作了一个特殊的http请求,显然有一个无效的cookie:
GET http://example.com/ HTTP/1.1
Accept: text/html, application/xhtml+xml, */*
Accept-Language: en-US
Accept-Encoding: gzip, deflate
...
Cookie: ASP.NET_SessionId=aaaaaaaaaaaaaaaaaaaaaaaa
果然,Session_Start
事件发生了,http 响应不包含Set-Cookie
标题:
HTTP/1.1 200 OK
Server: ASP.NET Development Server/10.0.0.0
Date: Thu, 24 Mar 2011 23:45:50 GMT
X-AspNet-Version: 2.0.50727
Cache-Control: private
Content-Type: text/html; charset=utf-8
Content-Length: 3710
Connection: Close
这是预期的行为吗?如果客户端的会话cookie不再有效,那么在客户端浏览器被说服销毁cookie之前,它们会被困在一些无人区域中?
ASP.NET是否可以选择将新会话cookie发送给客户端?毕竟,创建新会话 - 为什么不告诉客户呢?
这是一个奇怪的安全功能,如果服务器出现打嗝,用户必须删除所有cookie吗?