我有一个涉及几个.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>
答案 0 :(得分:1)
您失去会话可能有多种原因。
其中一些是:
如果您不确定可以进行事件记录的原因,那么为什么应用程序池会被回收。也许你会了解原因,并根据你可以采取预防措施。
对于日志记录,您可以在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工具来追踪此问题。
当你在解决方案中找不到像源这样的元素时,可以找到最多的条件。此时,服务器将尝试通过重新启动项目来重新加载无根据或丢失的对象。重新启动项目将导致重置所有会话对象。
感谢。