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

Lee*_*app 5 asp.net asp.net-mvc asp.net-mvc-3

我想我可能已经发现ASP.NET MVC的问题和它的事件管道.特别是,我发现Session_Start被多次调用,每个都包含一个新的SessionID.

这是一步一步的过程:

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

    protected void Session_Start(){}

  7. 在方法中设置断点

  8. 调试
  9. 请注意,在显示页面之前会捕获断点两次.如果在捕获断点时观察"Session.SessionID",您将看到每次会话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 Development Server)重复了上述步骤,结果相同.

有什么建议?

UPDATE

我决定在调试会话期间使用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. 在Fiddler中请求URL"/"并且响应正常.但是,请求另一个"/favicon.ico"文件,并再次使用新的SessionID触发Session_Start ...我继续.
  6. 所有后续请求都有响应,浏览器停止询问"/favicon.ico".

我记下了生成的三个SessionID中的每一个,并且看起来浏览器所持有的是第一个.因此,当我们进入上面的第6步,并且一切似乎都有效时,它实际上使用了生成的第一个SessionID.

所以......我决定主持一个"favicon.ico"文件.我将ico文件放在项目的根目录中,然后再次启动我的调试会话.这次,Session_Start只触发一次."/favicon.ico"成功送达(200).

所以...我猜它在某种意义上的工作方式应该......但为什么调用"/favicon.ico"会触发Session_Start事件???? 我不应该选择不托管图标吗?

ASIDE:我在ASP.NET(而不是mvc)项目中尝试了以上所有内容,并且它没有相同的问题,即使没有由默认的"ASP.NET Web应用程序"项目托管的favicon.ico文件.

小智 5

还挺有这个问题了一会儿,最后我意识到,这是因为当时正在进行一些HTTP/HTTPS有心计......看起来像它破坏并重新建立会话,如果你翻转SSL围绕这样的,你有

<sessionState mode="InProc" sqlCommandTimeout="3600" timeout="120" cookieless="false" />
<httpCookies httpOnlyCookies="true" requireSSL="true" />
Run Code Online (Sandbox Code Playgroud)

可能是新玩家或真正疲惫且不注意的人的陷阱!:)只是因为这可以帮助任何人...

  • 问题是正确的,因为你在没有ssl的情况下进行调试,这意味着浏览器每次都会抛弃会话,因为它已被告知(只要它不是SSL) - 如果在项目属性中设置"启用SSL" ,并浏览ssl网址,一切都会工作. (2认同)

Lee*_*app 2

我想我已经到了这样的地步:我有几个解决方案(尽管对我来说这两个方案都显得“老套”),所以我想我会接受这些并继续前进。

上面 @Tz_ 的评论提到我应该忽略 favicon 文件的路径。这基本上就是我要做的事情。(荣誉@Tz_!)

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

routes.IgnoreRoute("favicon.ico");
Run Code Online (Sandbox Code Playgroud)

我试了一下(添加了上面的内容),然后就解决了!

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

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

同样,这对我来说似乎都是黑客,因为我认为这是控制器工厂应该能够优雅地处理的事情。恕我直言