【问题标题】:MVC app getting stuck on an error after server restart服务器重新启动后 MVC 应用程序卡在错误中
【发布时间】:2014-07-07 16:14:08
【问题描述】:

场景如下。我启动了一个 MVC 应用程序实例来调试它。该应用程序使用简单的成员资格,我在此运行期间登录。然后我回到VS改变一些东西并再次启动实例。这种情况并不经常发生,但有时此时会员资格开始表现得很奇怪。当应用程序启动时,会调用 [Authorize] 属性(确切地说是控制器上的属性)后面的一些操作。但是该操作失败,因为WebSecurity.CurrentUserId 等于-1(有问题的操作只是根据WebSecurity.CurrentUserId 加载一些用户信息)。

如果我在浏览器中清除 cookie,一切都很好,但我不能指望用户在遇到问题时也会这样做。

我的同事向我解释说,它(可能)正在发生,因为我的本地 IIS 决定重新启动并且一些会话 cookie 变得无效,但如果这可能发生在 IIS 的本地实例上,那么它是否也可能发生在远程服务器?

另一个重要的事实是,失败的操作由我们编写的自定义过滤器调用(更像是重定向到)。此过滤器适用于所有操作(但不影响提及的操作)。这个过滤器可以让 MVC 忽略 [Authorize] 属性吗?

对于这个问题,我有一个肮脏的解决方法应该可以(使用这个特定的应用程序),但我更愿意首先防止问题出现。


我认为这与this 有关。基本上,当服务器重置身份验证cookie时就会死掉。它们会立即重新创建,除非我的应用在重新加载页面之前无法访问它们(就像登录一样)。

我部分解决了上述问题(在途中某处执行了重定向),因此应用程序不再卡住。但是,如果有人在服务器重新启动期间登录并且他尝试在此之后执行帖子,他的帖子将不起作用,并且他将被重定向到与帖子操作同名的获取操作(我们的自定义过滤器是对此负责)。不幸的是,我无法修复过滤器,因为我需要用户 ID,并且在调用过滤器时,它仍然是 -1。

【问题讨论】:

  • 为什么会话数据与授权有关?在 ASP.NET Request 的生命周期中,授权发生在 session_start 之前。
  • @Larry 据我了解,用户数据(例如 WebSecurity.CurrentUserId)存在于会话数据中。我的问题是,用户在重新启动后仍然被授权,但我什至无法获得他的 id(它等于 -1),应用程序只是崩溃并一直这样做,直到我清除浏览器中该站点的所有 cookie。

标签: asp.net-mvc iis cookies simplemembership


【解决方案1】:

我想我的问题写得不太好,而且有点本地化(我可能应该重写或重新提出),但潜在的问题比看起来更普遍,所以让我把所有有用的信息都保存到这个答案中.

问题 1:没有什么可以阻止 IIS 在远程服务器上出现故障并重新启动应用程序,所以是的,这可以(并且会发生)在远程服务器上(频率取决于应用程序本身和 IIS 配置)。会话数据消失的问题似乎与应用池的重启有关,而不是应用本身。

问题2:自定义过滤器与情况关系不大。正如 Larry 所指出的,简单的会员授权与会话数据无关。如果您的会话数据丢失,用户不会停止被授权,但是用户数据会存储在会话中。没有会话,您不知道用户是谁。在会话数据丢失后,此信息将变为可用的一个操作。因此,丢失会话数据可能会导致应用程序崩溃,或者在我的情况下(自定义过滤器取决于用户数据)会导致更奇怪的结果。

因此,如果您在应用中遇到用户数据意外消失(例如 WebSecurity.CurrentUserId 变为 -1),则可能值得调查您的应用池是否正在重新启动(以及原因)。为应用程序池设置内存限制似乎会增加重新启动的可能性。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-08
    • 1970-01-01
    • 2015-07-31
    • 2016-11-20
    相关资源
    最近更新 更多