丢失会话值

时间:2013-07-30 06:43:33

标签: c# asp.net session

我有一个涉及几个.aspx页面的进程。在一个中填写一些信息,挂起它,移动到另一个页面上有iframe,通过Web服务将iframe中的一些文档上传到服务器,挂起到文档列表和上传状态然后,在第三页上,执行其他涉及将所有数据保存到数据库的内容。

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

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

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

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

实际上是一样的。我正在使用...

设置我的会话变量
Session["Variable1"] = "fred";

任何想法为什么(随机,有时这个过程在实时服务器上工作正常)我似乎丢失了我的Session变量?

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

4 个答案:

答案 0 :(得分:1)

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

其中一些是:

  1. 您的sessionState超时已过期
  2. 您更新web.config或其他文件类型,导致您的应用程序域像App_Data文件夹中的文件一样进行回收
  3. 您的应用程序池被回收
  4. 只需通过物理复制和粘贴即可使用大量文件更新您的网站,ASP.NET将自动回收会话。
  5. 如果您不确定可以进行事件记录的原因,那么为什么应用程序池会被回收。也许你会了解原因,并根据你可以采取预防措施。

    对于日志记录,您可以在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);
    }
    

答案 1 :(得分:0)

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

解决方案是使用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会话状态。< / p>

答案 2 :(得分:0)

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

答案 3 :(得分:0)

还有一种情况会话会失去其价值。

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

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

感谢。