繁体   English   中英

Session_Start 在默认 ASP.NET MVC3 项目上多次触发

[英]Session_Start firing multiple times on default ASP.NET MVC3 project

我想我可能发现 ASP.NET MVC 及其事件管道存在问题。 特别是,我发现 Session_Start 被多次调用,每次都包含一个新的 SessionID。

这是分步过程:

  1. 打开VS2010
  2. 文件 | 新项目
  3. ASP.NET MVC 3 Web 应用程序,接受默认名称,单击确定
  4. Select 互联网应用程序(虽然我认为这并不重要),点击确定
  5. 创建完成后,编辑 Global.asax.cs 文件
  6. 添加以下方法(是的,它是空的):

    受保护的无效 Session_Start() { }

  7. 在方法中设置断点

  8. 调试
  9. 请注意,断点在显示页面之前被捕获了两次 如果您在捕获断点时观看“Session.SessionID”,您会看到 session id 每次都是新的。
  10. 进入主页后,单击“主页”或“关于”选项卡链接。
  11. Session_Start 将再次被触发,这次使用新的 SessionID。
  12. 继续执行,任何后续操作将不再触发 Session_Start。

我在标准 ASP.NET Web 应用程序(不是 MVC)上尝试了同样的事情,并且 Session_Start 只触发了一次。

我很确定我在这里没有做错什么,因为我使用的是默认项目模板,并且唯一正在修改的代码是 Global.asax.cs 文件,以添加 Session_Start 方法。

我正在使用 IIS Express,但我已经使用“Cassini”web 服务器(Visual Studio 开发服务器)重复了上述步骤,结果相同。

有什么建议吗?

更新

我决定在调试 session 期间使用 Fiddler 检查 HTTP 流量。 看起来:

  1. 当我请求“/”URL 时,第一个 Session_Start 被触发。 这似乎是合理的。 然后将当时生成的 SessionID 写入到浏览器的响应中。 再次,似乎合理。
  2. Fiddler 然后显示 *.js 和 *.css 文件的请求/响应。 所有的成功。 这些都不会触发 Session_Start。 目前很好。
  3. 然后 Fiddler 显示已对“/favicon.ico”进行了请求。 这时,Session_Start 触发,并生成一个新的 SessionID……我继续。
  4. 在 Fiddler 上,它显示找不到“/favicon.ico”文件 (404)。 显示网页。 我点击“主页”链接。
  5. 请求 URL "/" 并且在 Fiddler 中响应正常。 但是随后,请求了另一个“/favicon.ico”文件,并且 Session_Start 再次以新的 SessionID 触发......我继续。
  6. 所有后续请求都有响应,并且浏览器停止请求“/favicon.ico”。

我记下了生成的三个 SessionID 中的每一个,并且浏览器保留的似乎是第一个。 因此,当我们执行上述第 6 步时,似乎一切正常,它实际上是在使用生成的第一个 SessionID。

所以...我决定托管一个“favicon.ico”文件。 我将ico文件放在项目的根目录下,然后再次开始调试session。 这一次,Session_Start 只触发一次。 “/favicon.ico”已成功投放(200)。

所以...我想它在某种意义上是按照它应该的方式工作的...但是为什么对“/favicon.ico”的调用会触发 Session_Start 事件???? 我不应该选择不托管网站图标吗?

旁白:我在 ASP.NET(不是 mvc)项目中尝试了上述所有方法,并且没有相同的问题,即使默认的“ASP.NET Web 应用程序”项目没有托管 favicon.ico 文件。

我有一段时间遇到这个问题,最后我意识到这是因为发生了一些 http/https 恶作剧......看起来它会破坏并重新创建你的session如果你像这样翻转 ssl 并且你有

<sessionState mode="InProc" sqlCommandTimeout="3600" timeout="120" cookieless="false" />
<httpCookies httpOnlyCookies="true" requireSSL="true" />

可能是新玩家或真正疲倦且不注意的人的陷阱:.)仅供参考,以防万一这对任何人都有帮助...

我想我已经到了一个我有几个解决方案的地步(尽管对我来说这两个似乎都很“hacky”),所以我想我会接受这些并继续前进。

从上面的@Tz_ 那里得到了一条评论,提到我应该忽略 favicon 文件的路径。 这基本上就是我要做的。 (荣誉@Tz_!)

遇到以下帖子,(除其他外)。 它描述了一个问题,即当浏览器从 ASP.NET MVC 站点请求“/favicon.ico”文件时,MVC 堆栈错误地尝试查找并实例化 controller。 我不确定这是否适合我的情况,但答案建议添加以下路线条目:

routes.IgnoreRoute("favicon.ico");

我试了一下(添加了上面的内容),并且修复了它!

所以,我仍然不知道为什么“/favicon.ico”请求在 MVC 中有错误的身份,但我知道如何在我的情况下解决它。 任何一个:

  • 主持一个网站图标,
  • 或添加忽略路由条目。

再一次,对我来说,两者都像是黑客,因为我认为这是 controller 工厂应该能够优雅地处理的事情。 恕我直言

您每次都触发Session_Start的原因是因为您在 Web.Config 中的<system.web>中有<httpCookies requireSSL="true" />删除它,您对Web.Config很好。

当我的页面中有一些带有错误“src”属性的<img>时,这发生在我身上。 在“src”中放置一个有效路径解决了我的问题。

我无法重现此问题。 我已经使用 IIS 7.5、Cassini 和 Z5DA5ACF461B4EFB7E76ZEC861065B221 在 ASP.NET MVC 3/工具更新、Win08/R2/SP1 和 Win7/SP1 上进行了测试。 我在 Fiddler 中看到了 404 favicon 请求,但没有为 favicon 命中断点。 我用IE9、当前的FF和Chrome进行了测试。 每次我使用新浏览器访问该站点时,都会调用 Session_Start() 并且我会看到新的 session ID。 我在微软工作,所以我想知道如何重现这个问题。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM