Asked by:
Accessing Session Object inside Application_Error in Global.Asax

Question
-
User1738843376 posted
Hi,
I'm attempting to access the Session Object from within the Application_Error of the Global.Asax, but i keep getting "Object reference not set to an instance of an object.".
Here's my Application_Error code:
Sub Application_Error(ByVal sender As Object, ByVal e As EventArgs) Dim exc As Exception = Server.GetLastError Try If Not ErrorAlreadyLogged(exc.StackTrace.ToString()) Then Dim context As HttpContext = (CType(sender, HttpApplication)).Context exceptionUtility.logInfo("lang: " & context.current.session("Language")) LogError(exc, context) SendWarningEmailCheckoutError(exc) End If Catch ex As Exception ExceptionUtility.LogInfo("Error: " & ex.Message) ExceptionUtility.LogInfo("Error Details: " & ex.StackTrace.ToString()) End Try Server.Transfer("error_default.aspx") Server.ClearError() End Sub
I need to access the Session object so that i can capture details relative to the session, like the language being used when he website broke, or the userId (which i store in the session object) if logged in on the website when the error was thrown.
Any ideias on this?
Thx
Tuesday, October 9, 2018 1:00 PM
All replies
-
User465171450 posted
Depending on which error it is, the session object may not be available as it hasn't been spun up yet. It's not available immediately in the lifecycle such as you would see in Begin_Request
Tuesday, October 9, 2018 1:03 PM -
User1738843376 posted
Hi Markfitzme,
Thx for the reply.
So you're saying that there is no way to always catch values from the session object when inside the Application_Error sub?
My goal is to log to the database every error that happens on the website, and if that error hasn't been reported in the last 30mins, then send an email to me, otherwise, don't send the email.
Some of the data i wish to log on the database is only present on the session object, such as the language the user is using to navigate the website, the user id if logged in, etc.
How can i otherwise capture these?
Tuesday, October 9, 2018 2:45 PM -
User753101303 posted
Hi,
The keyword here is "always". The error could happen when session or even the current context is not available (for example in Application_Start or Session_End). Try to see what is null exactly and add the proper check to skip accessing the session or even the context when it is not available. For example (pseudo-code) :
' Log basic exception details
If context.current is nothing then ' log that current.context is nothing and exit
if context.current.session is nothing then 'log that session is, nothing and exit
' here you should be able to log session informationBTW I prefer to use what ASP.NET offers out of the box ie User.Identity.Name should tell which user is logged.
Tuesday, October 9, 2018 4:21 PM -
User-893317190 posted
Hi 0belix,
The session is accessible after the AcquireRequestState event in global.asax , may be your error is thrown before the event.
So if you want to access session in the Application_Error event, you could check whether the session is null.
If you want to get the language the user is using , you could get it through Thread.CurrentThread.CurrentCulture.Name
For more information about AcqureRequestState and other events , you could refer to
https://mycodelines.wordpress.com/tag/acquirerequeststate/
Best regards,
Ackerly Xu
Wednesday, October 10, 2018 6:37 AM