【发布时间】:2013-06-12 15:21:48
【问题描述】:
在最近的这个项目之前,我通常会避免进程内会话状态。我认为我有一个问题,即在发生未处理的异常后状态丢失。
这本身就很奇怪,因为请求上下文中的异常不会关闭工作进程。这可能是后台线程或回调或其他什么的异常,但这是一个简单的站点,没有什么特别的。
会话 ID 保持不变,后续请求不会调用 Session_Start(因此 WP 没有回收)。
我启用了很多日志记录,很明显我从数据层得到了一个异常,它是一个 HttpUnhandleException 内的 HttpException,然后当我立即浏览到主页时,请求会记录一个警告关于缺失的状态。
更糟。这不会发生在我的开发盒 (IIS Express) 上,仅在 QA 中发生。
编辑:
这是一段日志:
2013-06-12 13:44:29,975 [23] FATAL MvcApplication 100.100.100.100 pxtgn GET An unhandled exception occurred in the web application. The full exception will be unrolled below.
2013-06-12 13:44:30,897 [23] FATAL MvcApplication 100.100.100.100 pxtgn GET Exception.Type: HttpUnhandledException
Exception.Source: System.Web
Exception.Message: Exception of type 'System.Web.HttpUnhandledException' was thrown.
Exception.StackTrace: at System.Web.UI.Page.HandleError(Exception e)
at System.Web.UI.Page.ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint)
at System.Web.UI.Page.ProcessRequest(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint)
at System.Web.HttpContext.InvokeCancellableCallback(WaitCallback callback, Object state)
at System.Web.UI.Page.LegacyAsyncPageBeginProcessRequest(HttpContext context, AsyncCallback callback, Object extraData)
at System.Web.HttpApplication.CallHandlerExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute()
at System.Web.HttpApplication.ExecuteStep(IExecutionStep step, Boolean& completedSynchronously)
Exception.Type: HttpException
Exception.Source: CompanyNameProductName.MvcCoreApp
Exception.Message: An error was reported by the data layer: 0Image not found1-10.1007_978-1-4471-4294-2_21-16
Exception.StackTrace: at CompanyName.CompanyNameProductName.imagedetail.Page_Load(Object sender, EventArgs e) in c:\DATA\Git\ProductName\CompanyNameProductNameMvc\imagedetail.aspx.cs:line 55
at System.Web.UI.Control.LoadRecursive()
at System.Web.UI.Page.ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint)
2013-06-12 13:45:07,913 [25] DEBUG StandardPage 100.100.100.100 pxtgn GET Initializing page 'default_aspx' for GET with query string:
2013-06-12 13:45:07,913 [25] ERROR StandardPage 100.100.100.100 pxtgn GET No User instance in session state. Check the log for signs that the session was started properly since a User object should aways exist in session state, setup via session start events in ASP.NET.
最后一行显示了缺失的状态条件。 pxtgn 是会话 ID 的前 5 个字符。我点击了一个页面,我知道该页面的数据层会抱怨不存在的图像 ID。然后我接下来点击的任何页面都会导致我的检查记录丢失状态的问题。检查和状态参考在母版页的代码中,所以我可以点击任何页面来查看问题。这也意味着自定义错误页面不起作用 - 这就是我找到错误的方式。
我现在在检查后添加了Session.Abandon() 并回复了 500 以让我出狱,但这是一个非常奇怪的问题。我是代码库的新手,我想我已经到处检查过会话是否被清除或状态被覆盖。
【问题讨论】:
-
如果在
Application_Start中放置断点会发生什么?这又叫了吗? -
网站负载均衡吗?你使用网络花园吗?
-
@Darin - 它没有被调用。那里也有日志记录,看来 WP 一直在运行。
-
@Malcolm - 不在 QA 中,在生产它的 4 节点农场,在 NLB 上具有粘性会话。由于没有日志记录,因此不确定 prod 中是否存在问题(我添加的日志记录已经解决了这个问题)。
-
使用 fiddler 并查看会话 cookie 是否可能在这些帖子之间丢失。可能是旧会话仍然存在,但是由于 cookie 丢失,下一个请求被分配了一个新会话。
标签: asp.net asp.net-mvc