正在丢失会话值

本文关键字:会话 | 更新日期: 2023-09-27 18:25:22

我有一个涉及几个.aspx页面的过程。在一个页面中填写一些信息,抓住它,移动到另一个有iframe的页面,通过web服务将iframe中的一些文档上传到服务器,抓住文档列表和上传状态,然后在第三个页面上做其他事情,将所有数据保存到数据库中。

在从第1页转到第2页之前,我在Session变量中放入了一些数据。在第2页,数据被检索和显示,在从第2页的iframe中的页面内上传文件的过程中,更多的数据被放入Session变量中,然后在第3页,数据从Session中检索并写入数据库。

在测试服务器上,这一切都可以完美运行。在实时服务器上,我不断收到(随机)"对象未设置为引用"错误——这似乎是在报告会话变量已经消失。

我的理解是,在.aspx页面中。。。

HttpContext.Current.Session["myvariable"]
Session["myvariable"]

实际上是一样的。我正在设置会话变量,只是使用。。。

Session["Variable1"] = "fred";

有什么想法吗?为什么(随机地,有时进程在实时服务器上运行良好)我似乎正在丢失会话变量?

这是一个与web应用程序相对的网站。在VS2010中使用Framework 4.0开发

正在丢失会话值

丢失会话的原因可能有很多。

其中一些是:

  1. 您的会话状态超时已过期
  2. 您更新了导致应用程序域回收文件夹App_Data中类似文件的web.config或其他文件类型
  3. 您的应用程序池被回收
  4. 您只需物理复制和粘贴大量文件即可更新网站,ASP.NET将自动回收会话

若您不确定可以进行事件日志记录的原因——应用程序池被回收的原因。也许你会了解原因,并据此采取预防措施。

对于日志记录,您可以在Application_End 上编写以下代码块

public void Application_End()
{
    HttpRuntime runtime = (HttpRuntime)typeof(System.Web.HttpRuntime).InvokeMember("_theRuntime",   BindingFlags.NonPublic | BindingFlags.Static | BindingFlags.GetField, null, null, null, CultureInfo.InvariantCulture);
    if (runtime == null)
        return;
    string shutDownMessage = (string)runtime.GetType().InvokeMember("_shutDownMessage", BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.GetField, null, runtime, null, CultureInfo.InvariantCulture);
    string shutDownStack = (string)runtime.GetType().InvokeMember("_shutDownStack", BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.GetField, null, runtime, null, CultureInfo.InvariantCulture);
    //Do Logging as per your need and implementation      
    //Logging.Write(TraceEventType.Error, shutDownMessage, shutDownStack);
}

在会话变量中保存不可序列化的对象,并使会话在生产服务器上处于进程之外(负载平衡?)是一种很好的方法。检查对象是否可序列化,如果不可序列化。

实际情况是,您的实时服务器正在回收其应用程序池,这基本上重置了用于应用程序的内存。通常可以设置超时,但如果应用程序池回收,则会重置会话。

解决方案是对会话状态使用SQL server。

试试这个:http://support.microsoft.com/kb/317604

补充链接:http://www.codeproject.com/Articles/104082/Configuring-ASP-session-state-on-SQL-server

如果您使用更大的公共主机托管,他们可能已经准备好了SQL来处理会话状态,您应该能够在web.config文件中进行更改以使用SQL会话状态。

Ciao

还有一种情况是会话可能会丢失其值。

您可以使用Fiddler工具来追踪这个问题。

当在解决方案中找不到类似元素的源时,可以找到最多的条件。此时,服务器将尝试通过重新启动项目来重新加载那个没有根据或丢失的对象。重新启动项目将导致重置所有会话对象。

谢谢。