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

时间:2011-08-17 18:39:56

标签: 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. 选择互联网应用程序(虽然我认为不重要),然后单击确定
  5. 完成创建后,编辑Global.asax.cs文件
  6. 添加以下方法(是的,它是空的):

    protected void Session_Start() { }

  7. 在方法

  8. 中设置断点
  9. 调试
  10. 请注意,在显示页面之前,断点会被两次捕获。如果在捕获断点时观察“Session.SessionID”,您将看到每次会话ID都是新的。
  11. 进入主页后,点击“主页”或“关于”标签链接。
  12. Session_Start将再次触发,这次使用新的SessionID。
  13. 继续执行,任何后续操作都将不再触发Session_Start。
  14. 我在标准的ASP.NET Web应用程序(而不是MVC)上尝试了同样的事情,而Session_Start只触发了一次。

    我很确定我在这里做错了,因为我使用的是默认项目模板,而且唯一被修改的代码是Global.asax.cs文件,用于添加Session_Start方法。 / p>

    我正在使用IIS Express,但我使用“Cassini”Web服务器(Visual Studio Development Server)重复了上述步骤,结果相同。

    有什么建议吗?

    更新

    我决定在调试会话期间使用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”。
    7. 我记下了生成的三个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 个答案:

答案 0 :(得分:5)

有点有一段时间有这个问题,最后我意识到这是因为有一些http / https shenanigans正在进行...看起来它会破坏并重新创建你的会话如果你翻转像那样的ssl,你有

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

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

答案 1 :(得分:2)

我想我已经到了一个点,我有几个解决方案(虽然对我来说似乎都很'hacky'),所以我想我会接受这些并继续前进。

从@Tz_上面得到评论提到我应该忽略favicon文件的路线。这基本上就是我要做的。 (荣誉@Tz _!)

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

routes.IgnoreRoute("favicon.ico");

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

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

  • 主持一个favicon,
  • 或添加忽略路由条目。

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

答案 2 :(得分:1)

每次Session_Start点击的原因是因为<httpCookies requireSSL="true" /> <system.web>中的Web.Config删除了这个,你就可以了。

答案 3 :(得分:0)

我无法重现这个问题。我使用IIS 7.5,Cassini和IIS Express测试了ASP.NET MVC 3 /工具更新,Win08 / R2 / SP1和Win7 / SP1。我在Fiddler中看到了404 favicon请求,但是对于favicon来说,没有达到突破点。我用IE9测试了当前的FF和Chrome。每次我使用新浏览器访问该站点时,都会调用Session_Start()并看到新的会话ID。我为微软工作,所以我想知道如何重现这个问题。

答案 4 :(得分:0)

当我在我的网页中有一些<img>时出现错误的“src”属性时,就会发生这种情况。在“src”中放置一个有效的路径解决了我的问题。