2014-05-19 62 views
1

该场景如下。我开始一个MVC应用程序的实例来调试它。该应用程序使用简单的会员资格,并在此运行期间登录。然后我回到VS改变一些东西并再次启动实例。这不是经常发生,但有时在这一刻,会员开始表演奇怪。在应用程序启动时,会调用[Authorize]属性(确切地说属性在控制器上)后面的某些操作。但是,由于WebSecurity.CurrentUserId等于-1,因此操作失败(相关操作仅根据WebSecurity.CurrentUserId加载一些用户信息)。服务器重启后,MVC应用卡住了错误

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

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

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

我对这个应该可以工作的问题有一个肮脏的解决方法(用这个特定的应用程序),但我宁愿防止问题出现在第一个地方。


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

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

+0

为什么会话数据与授权有关?在ASP.NET Request的生活中,授权发生在session_start之前。 – Larry

+0

@Larry从我所了解的用户数据(如WebSecurity.CurrentUserId)生活在会话数据。我的问题是,用户在重新启动后保持授权,但我甚至无法得到他的id(它等于-1),应用程序崩溃并继续这样做,直到我清除浏览器中该网站的所有cookie。 – jahu

回答

0

我想我的问题不是写得太好,而且很有本地化(我应该重写或者重写它),但是下层的问题比看起来更普遍,所以让我把所有有用的信息打包回来回答。

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

问题2:自定义过滤器与情况无关。正如拉里所指出的那样,简单的会员授权与会话数据无关。如果会话数据丢失,用户不会停止授权,但用户数据存储在会话中。没有会话你不知道用户是谁。在会话数据丢失之后,这些信息将变为可用。因此,丢失会话数据可能会导致应用程序崩溃或类似于我的情况(自定义筛选器依赖于用户数据)甚至导致更加糟糕的结果。

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