0

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?

StingyJack
  • 19,041
  • 10
  • 63
  • 122
crazyTech
  • 1,379
  • 3
  • 32
  • 67
  • 1
    A bug in the code somewhere in or in the caller/invariants of: `PivotServer.SectionBasedRelatedModules.SectionBasedPerlsViewer.tailorConfigurationDetailsOfPageElementsToFallInLineWithTutorialSelection()`. Of course, a developer will have to isolate out exactly where/what the culprit is. I recommend using a debugger. If "clearing the cache" seems to "fix the issue", that sounds like something to investigate .. perhaps some bad data/invariant is stored, or attempted to be restored in a culture-dependant nature. –  Mar 18 '13 at 17:36
  • 1
    Almost all cases of `NullReferenceException` are the same. Please see "[What is a NullReferenceException in .NET?](http://stackoverflow.com/questions/4660142/what-is-a-nullreferenceexception-in-net)" for some hints. – John Saunders Mar 18 '13 at 17:40
  • 1
    can you post code from the exception site? SectionBasedPerlsViewer.aspx.cs - the method that has line 160 in it? – StingyJack Mar 18 '13 at 17:41
  • 1
    The fact that it has your absolute paths is because you have the debugging information included with the DLL's. http://stackoverflow.com/questions/628565/display-lines-number-in-stack-trace-for-net-assembly-in-release-mode – StingyJack Mar 18 '13 at 17:48
  • @StingyJack Thanks for mentioning the line 160. I should have done that before. It certainly at the least narrowed down the reasons for the error. I re-editted my post, could you please check my stackoverflow post? – crazyTech Mar 18 '13 at 18:16
  • Are you deploying to a clustered environment? – Gabriel Isenberg Mar 18 '13 at 18:31
  • @gabriel-isenberg I deploy to a single standalone server Windows 2008 with IIS 7. We do some aliasing with urls. Would that cause HttpContext.Current.Session to lose variable values? – crazyTech Mar 18 '13 at 18:35
  • Any number of things could cause session state to be null. You should always be prepared for that. – John Saunders Mar 18 '13 at 18:37
  • @john-saunders The problem in this particular case is that it's sporadic.Moreover, it's only a particular variable in the HttpContext.Current.Session( all the other variables in the HttpContext.Current.Session are valid). Therefore, the HttpContext.Current.Session is still valid, but some of the variables in the HttpContext.Current.Session lose value. – crazyTech Mar 18 '13 at 18:51
  • I have never seen that happen. In fact, I don't believe that it _is_ happening. At least, not with the stock .NET components. If you were using a custom session state provider, or perhaps if you have a load-balanced system, or something strange. Session is a single dictionary, so it's all or none. – John Saunders Mar 18 '13 at 18:56
  • @john-saunders Our server is a single standalone Virtual Machine Server with Windows 2008 server. There is No load-balancing. – crazyTech Mar 18 '13 at 19:13
  • In that case, I would question your analysis of the situation. I have never heard of a single element of session state being lost, and don't know of any mechanism that could cause that. – John Saunders Mar 18 '13 at 19:14
  • I have heard of this, but its usually due to the value being cleared by another page. Search through your entire code for the text value "courseNameAssociatedWithLoggedInUser" and see if its getting set to null by some page or function. – StingyJack Mar 18 '13 at 20:55

3 Answers3

3

"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.

StingyJack
  • 19,041
  • 10
  • 63
  • 122
1

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

1

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;
    }
Ian
  • 2,898
  • 1
  • 27
  • 29