我想我可能发现了 ASP.NET MVC 及其事件管道的问题。特别是,我发现 Session_Start 被多次调用,每次都包含一个新的 SessionID。
以下是分步过程:
- 打开VS2010
- 文件 |新项目
- ASP.NET MVC 3 Web Application,接受默认名称,单击“确定”
- 选择Internet Application(尽管我认为这并不重要),单击“确定”
- 创建完成后,编辑Global.asax.cs文件
-
添加以下方法(是的,它是空的):
受保护无效 Session_Start()
{
}
在方法中设置断点
- Debug
- 注意断点被捕获twice在显示页面之前。如果您在捕获断点时观察“Session.SessionID”,您将看到会话 ID 每次都是新的。
- 进入主页后,单击“主页”或“关于”选项卡链接。
- Session_Start 将再次被触发,这次使用新的 SessionID。
- 继续执行,任何后续操作将不再触发 Session_Start。
我在标准 ASP.NET Web 应用程序(不是 MVC)上尝试了同样的操作,并且 Session_Start 仅触发一次。
我很确定我在这里没有做错什么,因为我使用的是默认项目模板,唯一要修改的代码是 Global.asax.cs 文件,以添加 Session_Start 方法。
我使用的是 IIS Express,但我使用“Cassini”Web 服务器(Visual Studio 开发服务器)重复了上述步骤,得到了相同的结果。
有什么建议吗?
UPDATE
我决定在调试会话期间使用 Fiddler 检查 HTTP 流量。看起来:
- 当我请求“/” URL 时,会触发第一个 Session_Start。这似乎很合理。然后将当时生成的SessionID写入到浏览器的响应中。再次看来,似乎很合理。
- 然后,Fiddler 显示 *.js 和 *.css 文件的请求/响应。一切成功。这些都不会触发 Session_Start。目前很好。
- 然后 Fiddler 显示已对“/favicon.ico”发出请求。这时,Session_Start 触发,并生成一个新的 SessionID...我继续。
- 在 Fiddler 上,它显示找不到“/favicon.ico”文件(404)。显示网页。我点击“主页”链接。
- 在 Fiddler 中请求 URL“/”并且响应正常。但随后,请求另一个“/favicon.ico”文件,并再次使用新的 SessionID 触发 Session_Start...我继续。
- 所有后续请求都有响应,并且浏览器停止请求“/favicon.ico”。
我记下了生成的三个 SessionID 中的每一个,浏览器保存的似乎是第一个。因此,当我们进行到上面的第 6 步时,一切似乎都正常,它实际上使用的是生成的第一个 SessionID。
所以...我决定托管一个“favicon.ico”文件。我将 ico 文件放置在项目的根目录中,然后再次开始调试会话。这次,Session_Start 仅触发一次。 “/favicon.ico”已成功提供(200)。
所以...我想它在某种意义上是按应有的方式工作的...但是为什么调用“/favicon.ico”会触发 Session_Start 事件???我不应该选择不托管网站图标吗?
旁白:我在 ASP.NET(不是 mvc)项目中尝试了上述所有方法,并且没有出现相同的问题,即使默认的“ASP.NET Web 应用程序”项目没有托管 favicon.ico 文件。
I kinda遇到这个问题有一段时间了,最后我意识到这是因为有一些 http/https 恶作剧正在进行......看起来它会破坏并重新创建你的会话,如果你像这样翻转 ssl 并且你有
<sessionState mode="InProc" sqlCommandTimeout="3600" timeout="120" cookieless="false" />
<httpCookies httpOnlyCookies="true" requireSSL="true" />
对于新玩家或非常累且注意力不集中的人来说,这可能是一个陷阱! :)
仅供参考,以防这对任何人有帮助......
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)