我无法跟踪会话在网络应用中重新启动的原因。
我已在Session_End
或Application_End
过程中放置代码以尝试跟踪发生的情况,但在会话重新启动之前,代码中都没有达到这两个过程并触发{{1再次执行程序。
有没有人知道在不触发Session_Start
或Session_Start
程序的情况下导致Session_End
程序重启的原因是什么?
基本上,Application_End
中有代码在Session_Start
中设置会话变量和代码,试图记录会话结束的原因
在网站上有100个或更多带有VB代码的aspx页面,看起来会话随机重启,有时在加载主页时最多3次。我在Session_End
过程中的global.asax页面中设置了一个中断设置,它在那里打破,所以我可以告诉它何时重新加载并丢失在后面的任何ASPX页面代码中设置的所有会话变量。
我知道一些常见的原因,例如写入某些文件或文件夹(例如App_Data文件夹),以及应用程序池正在回收,但我似乎无法追查Session_Start
或{{1}时发生这种情况的原因永远不会开火,我无法记录它结束的原因。
我继承了这个“项目”,此时我正在通过代码“恭维”,所以感谢你们给我的任何帮助......
服务器是IIS7,运行ASP.NET,代码是VB.NET,我还在web.config文件中包含'sessionState mode =“InProc”',以确保使用会话过程。< / p>
这是Session_End
程序
Application_End
这是Session_Start
和 HttpContext.Current.Session.Item("SessionMessageView") = "no"
HttpContext.Current.Session.Item("DefaultMenuName") = "Default"
HttpContext.Current.Session.Item("RootVirtualPath") = "/"
HttpContext.Current.Session.Item("BlockerTested") = False
HttpContext.Current.Session.Item("BlockerTurnedOn") = False
HttpContext.Current.Session.Item("IsMobileBrowser") = False
程序
Session_End
如果我只能弄清楚为什么Application_End
程序在 Dim runtime As HttpRuntime = DirectCast(GetType(System.Web.HttpRuntime).InvokeMember("_theRuntime", System.Reflection.BindingFlags.NonPublic Or System.Reflection.BindingFlags.[Static] Or System.Reflection.BindingFlags.GetField, Nothing, Nothing, Nothing), HttpRuntime)
If runtime Is Nothing Then
Return
End If
Dim shutDownMessage As String = DirectCast(runtime.[GetType]().InvokeMember("_shutDownMessage", System.Reflection.BindingFlags.NonPublic Or System.Reflection.BindingFlags.Instance Or System.Reflection.BindingFlags.GetField, Nothing, runtime, Nothing), String)
Dim shutDownStack As String = DirectCast(runtime.[GetType]().InvokeMember("_shutDownStack", System.Reflection.BindingFlags.NonPublic Or System.Reflection.BindingFlags.Instance Or System.Reflection.BindingFlags.GetField, Nothing, runtime, Nothing), String)
If Not System.Diagnostics.EventLog.SourceExists(".NET Runtime") Then
System.Diagnostics.EventLog.CreateEventSource(".NET Runtime", "Application")
End If
Dim log As New System.Diagnostics.EventLog()
log.Source = ".NET Runtime"
log.WriteEntry([String].Format(vbCr & vbLf & vbCr & vbLf & "_shutDownMessage={0}" & vbCr & vbLf & vbCr & vbLf & "_shutDownStack={1}", shutDownMessage, shutDownStack), System.Diagnostics.EventLogEntryType.[Error])
程序多次触发时没有触发,我可能能够找到会话重启的原因。
答案 0 :(得分:1)
请参阅有关Session_Start的问题:Session_Start firing multiple times on default ASP.NET MVC3 project
请注意,如果您在Session_End
SQLServer
指令中使用InProc
会话状态存储,或web.config
模式以外的任何其他模式,sessionState
将永远无法运行
答案 1 :(得分:0)
在詹姆斯的帮助下,我发现了这个问题。添加了新代码以确定用户的浏览器是否接受cookie,然后在禁用cookie的情况下对其进行测试。启用cookie时,不会发生这种情况,并且会话不会重新启动。似乎当浏览器不接受cookie,并且您尝试在该浏览器上存储cookie时,由于错误而导致会话重新启动而不会触发End_Session!
现在我想我们将不得不重新考虑cookie测试并想出一种方法来存储以某种方式链接到用户的标志,并且可以指示是否接受cookie而不尝试在用户的机器上存储cookie ...嗯
谢谢大家对此的帮助...有时这会让你感到沮丧......我想起了一个错误,即错误的增加与代码的变化成正比