ThinkGeo.com    |     Documentation    |     Premium Support

LoadViewState NullReferenceException

Hi.


We are having the problem as follows.  If a user is on a web page with the Map Control, and the IIS worker process is recyled, the following exception (Stack Trace) occurs:




[NullReferenceException: Object reference not set to an instance of an object.]

   ThinkGeo.MapSuite.WebEdition.Map.LoadViewState(Object savedState) +717

   System.Web.UI.Control.LoadViewStateRecursive(Object savedState) +183

   System.Web.UI.Control.LoadChildViewStateByIndex(ArrayList childState) +134

   System.Web.UI.Control.LoadViewStateRecursive(Object savedState) +221

   System.Web.UI.Control.LoadChildViewStateByIndex(ArrayList childState) +134

   System.Web.UI.Control.LoadViewStateRecursive(Object savedState) +221

   System.Web.UI.Page.LoadAllState() +312

   System.Web.UI.Page.ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint) +1661


Typically our other pages trap (on Page_Load) that the session state has been reset and we redirect to the login screen. We need to know how to deal with this exception (or if it is actually a bug on your end)?  Thanks. 

 



Hi Tony, 
  
 In life circle “LoadViewState” of web map control, we restore some state from the Session and ViewState. Whenever the IIS is recycled, the session will lost which causes your pasted exception. 
  
 It’s not the bug of our end, we need to save and restore some important properties which are difficult to completely serialize such as overlay. We can save all of them into ViewState, but the disadvantage is it will be a huge size of data to be transferred between client and server; also it throws exception when it has events. 
  
 In web edition, the session will not expire for we refreshing the session continuously; but if you recycle the IIS which we can’t handle, the session must be expired. 
  
 I have an idea that check whether the session is expired; if yes, your page redirect to the login page, after re-login, add a flag parameter to the address you need restore. In the PageLoad, try to get the flag parameter, if it exists, re-add the overlays and all the configuration of the map. I hope it helps. 
  
 If you have any questions please let me know. 
  
 Thanks, 
 Howard

Is it at all possible to give a quick example.  It is probably my lack of knowledge but I cannot seem to trap the event that is causing the NullReferenceException...thanks



Tony,

I think I didn’t make it clear last time. General speaking, we check whether the IIS is restarted by a flag in the session, whenever the session restart, we re-config the map again. By the way, the event which throws the exception cannot be tracked for it’s in another process.



To fix this, you can check the session and re-add the configuration again in one step of the web page life circle “SaveViewState”.



Please try the following quick sample.



Thanks,

Howard 



834-Post5899.zip (2.01 KB)

Hi Howard,


Thanks for example and I see what you are doing but I still have the issue that if the worker process is stopped due to the idle timeout, the original NullReferenceException occurs wihen the map is loading its viewstate?  I tried putting your similiar code in loadviewstate but it didn't seem to do anything?



Tony, 
  
 It seems my sample doesn’t help you; I’m not sure why. Could you send me a quick sample to show me your scenario or give me more information about it? It’ll be easier to understand. 
  
 Thanks, 
 Howard

Hi Howard,


To reproduce this, I ran the sample that you provided me.  If the w3wp is stopped, when you click the button (to clear session) I get the exception.  Let me know if you do not find this same behaviour.  Thanks a lot.



Tony,  
  
 When you stop the w3wp.exe, session object is disposed. So when running Session.Clear(), it will surely throw the exception you saw. Try to commend the Session.Clear() in the Button1_Click event, the sample goes fine. 
  
 If it doesn’t satisfy your scenario, please let me know. 
  
 Thanks, 
 Howard

Howard,


 


If I comment out the Session.Clear() line in the Button1_Click event:



 



 


 


 


// Session.Clear();

And then stop the w3wp process, the exception as described occurs if I click the button on the page?  Maybe I am doing something else wrong if this does not occur for you?




Tony, 
  
 Do you mean the issue still exists? I didn’t recreate this issue when I comment out the Session.Clear(); Could you please remove the IE cache and try again. If the issue still exists, I’ll send you my entire project which can directly run. 
  
 Any questions please let me know. 
  
 Thanks, 
 Howard

Yes, if w3wp.exe is shutdown, I get the exception as listed.  For you information, I am using WebEdition 3.1.16 and IIS 7.



Tony,



I'm sorry that when I'm testing, I forgot stopping the w3wp.exe. When I stopped it, the exception throws. That's because I just process the session in SaveViewState but LoadViewState, please try this file, I think it helps.



Please let me know how it works.



Thanks,

Howard



863-DisplayASimpleMap.aspx.cs (1.84 KB)

Howard,


Added the changes that you made and the Exception is still the same.  If the w3wp process stops, the exception as listed occurs.



Tony, 



This time please try this; I tested it for several times, it works fine. I record a video but it's too large to attach here. Please try this solution.



Any questions please let me know.



Thanks,

Howard



868-DisplayASimpleMap.aspx.cs (1.59 KB)