1

我有一个涉及几个 .aspx 页面的过程。填写一些信息,坚持下去,移动到另一个有 iframe 的页面,通过网络服务将 iframe 中的一些文档上传到服务器,坚持文档列表和上传状态然后,在第三页上,执行其他操作,将所有数据保存到数据库中。

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

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

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

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

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

Session["Variable1"] = "fred";

任何想法为什么(随机,有时该过程在实时服务器上运行良好)我似乎丢失了我的 Session 变量?

这是一个网站,而不是 Web 应用程序。在 VS2010 中使用 Framework 4.0 开发

4

4 回答 4

1

这是一个很好的可能性,您可以在会话变量中保存不可序列化的对象,并使您的会话远离生产服务器上的 proc(负载平衡?)。检查您的对象是否可序列化,如果不能使它们可序列化。

于 2013-07-30T08:17:21.677 回答
1

您失去会话的原因可能有多种。

他们之中有一些是:

  1. 您的 sessionState 超时已过期
  2. 您更新您的 web.config 或其他文件类型,导致您的应用程序域像文件夹 App_Data 中的文件一样回收
  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);
}
于 2013-07-30T06:51:24.713 回答
0

还有另一种情况,会话可能会失去其价值。

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

当您在解决方案中找不到某些元素(如源)时,可以找到大多数情况。在那一刻,服务器将尝试通过重新启动项目来重新加载那个毫无根据或丢失的对象。重新启动项目将导致重置所有会话对象。

谢谢。

于 2014-10-09T09:55:38.410 回答
0

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

解决方案是为您的会话状态使用 SQL 服务器。

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

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

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

再见

于 2013-07-30T06:46:08.300 回答