How to force state server to throw away all sessions?

▼魔方 西西 提交于 2019-12-10 20:06:49

问题


I have an asp.net web app which uses state server to store its sessions. When we change a type of something which is stored in the session, all users with active sessions got error, beacuse the "old session" contains insrtances of "old type".

I thought that the simplest way to overcome this problem would be to restart the state server, therefor get rid of all sessions. However, this was proffed to be a naive approach. Sessions seems to be still active (users with session old cookie are still capable of working). Is there some other way to force the session state server throw away all sessions, so that old users will be assigned new session? It is ok if they would be forced to authenticate again.

Or is there some other (better) way of abandoning all sessions? Ideally not programmaticaly, but something our admin could do?

Programmatical approach woudl be maybe calling Session.RemoveAll in Application_End would solve the issue, bu is this standard approach?

Where are session stored in state server if not in memory (which should cease to exist on restart)?

I have found two SO questions which are relevant:

Clear all sessions on application start - this is rather incomplete programmatical solution

How to clear SQL session state for all users in ASP.NET - this is exactly what I would needed if I had had an sql server approach of storing of session data


回答1:


Ok, So it seems so (after a bit of experimenting), that restarting of the session state server throw away all data in the session.

The users still have their session ID valid after restart though, which got me originally thinking that the session is not thrown away.

I guess that if the session id sent from a user is not assigned to some existing session, than it is reused for the new one, so user still operates with the same id. Nevertheless, the data in session are cleared.




回答2:


This doesn't directly answer your question but a clean programmatic workaround could be to wrap access to Session and try to be smart and detect issues:

// example
public string SomethingWrapper
{ 
   try
   {
       return (string)Session["something"];
   } 
   catch
   {
       return "defaultvalue";   
   }
}

This should work for value objects and composite objects too. If the deserializer fails for a compound object, you get an exception and have a chance to return just anything, a default value for example. Or you can recreate the value and put it back into session container.



来源:https://stackoverflow.com/questions/21457165/how-to-force-state-server-to-throw-away-all-sessions

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