Rare System.NullReferenceException show up for a HttpContext.Current.Session[“courseNameAssociatedWithLoggedInUser”] that was previously populated?

房东的猫 提交于 2019-12-13 03:39:41

问题


Our ASP.NET C# web application is used in the following environment

  • .NET Framework 4
  • Silverlight 4 / PivotViewer
  • IIS 7
  • Windows 2008
  • Visual Studio 2010 .NET IDE
  • C#
  • HTTPS ( SSL )

Our Silverlight 4 / PivotViewer controls are obviously embedded in ASP.NET pages.

In rare cases we get the "Object reference not set to an instance of an object. error when navigating around ASP.NET pages that host our Silverlight 4 / PivotViewer modules on our standalone Windows 2008 server with IIS 7.

Also, there is number of very odd things about the error. First, it occurs only sometimes on certain user computers. To elaborate, it usually only occurs when a the user uses a computer that accesses our ASP.NET web application for the first time.

Moreover, once we clear the browser cache the error does Not occur when navigating around ASP.NET pages that host our Silverlight 4 / PivotViewer modules.

Another interesting aspect about the error is that it refers to absolute path on my local development computer in the error stack trace when it is in reality deployed to the standalone Windows 2008 server with IIS 7. That`s really strange because before I deploy to the standalone Windows 2008 server with IIS 7, I ensure that all configuration parameters in files such as web.config refer to the standalone server environment. In other words, I remove any references to configuration parameter values associated with my local development computer.

Therefore, I am confused as to why it refers to absolute path on my local development computer in the error stack trace.

It would be bad experience for the user to get the "Object reference not set to an instance of an object.` while using the site. Also, it would be bad user experience if we have to tell the user to clear his/her browser cache everytime the error shows up.

Server Error in '/' Application. Object reference not set to an instance of an object. Description: An unhandled exception occurred during the execution of the current web request. Please review the stack trace for more information about the error and where it originated in the code.

Exception Details: System.NullReferenceException: Object reference not set to an instance of an object.

Source Error: An unhandled exception was generated during the execution of the current web request. Information regarding the origin and location of the exception can be identified using the exception stack trace below.

Stack Trace:

[NullReferenceException: Object reference not set to an instance of an object.] PivotServer.SectionBasedRelatedModules.SectionBasedPerlsViewer.tailorConfigurationDetailsOfPageElementsToFallInLineWithTutorialSelection() in C:\VisualStudioWorkSpace\VisualCSharpProjects\PerlsPivot\PivotServer\SectionBasedRelatedModules\SectionBasedPerlsViewer.aspx.cs:160 PivotServer.SectionBasedRelatedModules.SectionBasedPerlsViewer.Page_Load(Object sender, EventArgs e) in C:\VisualStudioWorkSpace\VisualCSharpProjects\PerlsPivot\PivotServer\SectionBasedRelatedModules\SectionBasedPerlsViewer.aspx.cs:146 System.Web.Util.CalliHelper.EventArgFunctionCaller(IntPtr fp, Object o, Object t, EventArgs e) +24 System.Web.UI.Control.LoadRecursive() +70 System.Web.UI.Page.ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint) +3063

Version Information: Microsoft .NET Framework Version:4.0.30319; ASP.NET Version:4.0.30319.272

I looked at line 160 which contains the following code:

String coursename = HttpContext.Current.Session["courseNameAssociatedWithLoggedInUser"].ToString();

Obviously, this tells us that there is no value for the variable "courseNameAssociatedWithLoggedInUser" in the HttpContext.Current.Session.

However, I took the same steps on another computer but it all ran smoothly. Also, I am sure that I am giving a value to the HttpContext.Current.Session["courseNameAssociatedWithLoggedInUser"] as soon as the user logs in.

Does the HttpContext.Current.Session["courseNameAssociatedWithLoggedInUser"] get corrupted for some reason? If so, why, and how do we prevent it?

Should I be using Page.Session instead of HttpContext.Current.Session? Would that help?


回答1:


"Obviously, this tells us that there is no value for the variable"courseNameAssociatedWithLoggedInUser" in the HttpContext.Current.Session."

Not exactly... given your code...

String coursename = HttpContext.Current.Session["courseNameAssociatedWithLoggedInUser"].ToString();

... the following items could be causing this

  • HttpContext - unlikely
  • HttpContext.Current - more often than you would think, but would be reproducible
  • HttpContext.Current.Session["courseNameAssociatedWithLoggedInUser"]

To find out the specific item in that chain, you could do something like this (pseudo code)

function string GetCourseNameThingie()
{
  if HttpContext is null
    throw new Exception("HttpContext is null")
  if HttpContext.Current is null
    throw new Exception("HttpContext.Current is null")
  if HttpContext.Current.Session["courseNameAssociatedWithLoggedInUser"] is null
    throw new Exception("HttpContext.Current.Session["courseNameAssociatedWithLoggedInUser"]is null")

   return HttpContext.Current.Session["courseNameAssociatedWithLoggedInUser"].ToString()
}

This would tell you specifically what was missing. As we have pointed out, it is more likely the value is either being cleared by another page or an error is occurring that is severe enough to destroy session for that user (Do you have a Application_Error or Session_End handler in Global.asax?).

You can also try wrapping the original statement in a try/catch and if an exception occurs, immediately check another session variable you assume to be still working. This will also tell you for sure whether the other variables are OK or not.




回答2:


First, sorry for my grammar-English.

I had a similar issue with my .net applications and the reason was the idle time expiration.

There are four time expiration settings "(Yes 4)" and the recycling process of the application pools. I did the following

A) From Application pool: Open the advance setting and change the "Idle Time out". By default is 20 minutes.

Also, set the "Regular Time Interval" to 0. so it wont be recycled. I do not know why microsoft decided to default this to 1740 minutes. This is not a time out setting, it is a setting for always recycling the appPool after a period of time, so if your users are in the middle of something they will loose everything or having exceptions like that one you are having. Setting it to 0 will disable this.

B) Authentication Time Out. if you are using it, for example Form Authentication, then go to the authentication feature of your virtual directory app, right click in "Form Authentication" and select "Edit". Change the authentication cookie-time out.

C) ASP.NET Session State. in ISS, open the .net session state feature and change the session time-out. It is also by default 20 minutes.

D) asp.net form authentication time out. This was confusing for me at the beginning because I had already modified the cookie-time out of the form authentication in IIS (Step B). So I still had some problems, when I realised that I also need to change the web.config form authentication tag in order to add a time out attribute for changing the default 20 minutes.

My tag is looking like that: ...forms name=".ASPXFORMSAUTH" path="/" loginUrl="frmLogin.aspx" timeout="1740" protection="All" ...

We have developed a javascript mechanism that take the session state time out setting so we warm users that the system is about to auto log off due to inactivity.

It works beautiful now, Basically I have set all the time out settings to "1740" minutes, except the session state that we set to 30 minutes. So at the minute 29 of inactivity we show the user that the system will auto log off in a minute unless that they do some activity so the idle time is beginning from 0 again. Brilliant, now we do not have any problem with sessions.

Anyway guys, I have told you our experience and how we solve a similar problem that you are having now. However, the reason why I ended here is because we also want to eliminate the references to the absolute path on my local development computer at the moment of any exception.

We have not figured out why it is showing the absolute path. We have compiled our DLL assemblies in released mode, but this does not change anything. Have someone of you sort it out this issue?????

Thanks guys




回答3:


Referencing a Session Within a ViewModel

You may not be using ASP.net MVC, but this would be useful if someone were to be looking for an answer.

I was in exactly the same situation except I would receive the null exception every time, whereas my colleague didn't at all, even though we were running exactly the same code.

Our mistake was to reference a session variable from a ViewModel, which is apparently bad practice. The code was changed so that the ViewModel received the session contents via the controller then set it as a property of the ViewModel. The session data (my example is called ProcessingWeek) would use this.ProcessingWeek, and not look directly at the httpcontext.current.session["ProcessingWeek"].

EventMatchResult Match = new EventMatchResult(
      (ImportedEventModel)SessionData.ImportedEventModel,
      ref db,
      SessionData.ProcessingWeek);

...

public EventMatchResult(ImportedEventModel Event, ref CFModel db, 
                                                   int ProcessingWeek)
    {
        this.db = db;
        this.MatchedField = new List<PlayerMatchResult>();
        this.ImportedEvent = Event;
        this.ProcessingWeek = ProcessingWeek;
    }


来源:https://stackoverflow.com/questions/15483170/rare-system-nullreferenceexception-show-up-for-a-httpcontext-current-sessionco

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!