I have an Asp.net webservice. It has method M1. M1 creates a folder for each session. When a session is expired, I delete that folder in global.asax using the following code.
void Session_End(object sender, EventArgs e)
{
try
{
System.IO.DirectoryInfo dirMyPacksFolder = new System.IO.DirectoryInfo(Utilities.getMyPacksFolder(Session));
//dirMyPacksFolder.Parent.CreateSubdirectory("ended_" + Session.SessionID);
if (dirMyPacksFolder.Exists)
{
dirMyPacksFolder.Delete(true);
}
}
catch (Exception ex)
{
Utilities.logException("", ex);
}
}
When I open my webservice in browser and call M1, it operates correctly and the folder is deleted on timeout expiration time that I have set. But when I submit “Invoke” button of webservice for the second time (after session timeout and folder is deleted), its session starts (create folder) and ends (deletes folder) immediately before timeout that I have set.
Why this happens?
If I open a new window (new session) for each method call everything is OK. But I have problem when I click “Invoke” button for second time. It is something like caching problem for same sessions.
Answers:
Thank you for visiting the Q&A section on Magenaut. Please note that all the answers may not help you solve the issue immediately. So please treat them as advisements. If you found the post helpful (or not), leave a comment & I’ll get back to you as soon as possible.
Method 1
Have a look at this post, I believe your problem may be similar:
- Client sends a cookie with a Session Id for an expired session
- Server creates a new session, reusing the id sent by the client
- If the request does not access session, the session is immediately abandoned.
Does your WebMethod actually access Session state? If not, try adding an access to a dummy session variable.
Update:
These lines of code in Global.asax solve the problem:
void Session_Start(object sender, EventArgs e)
{
Session["dummy"] = "dummy session for solving immediate session expire";
}
Update 2
Personally I wouldn’t do the directory creation in Session_Start; instead I’d have a method called something like EnsureMyPacksFolder which the app is required to call before any attempt to access the folder. This would look something like the following, avoids the need for a “dummy” Session variable, and means the folder is only created if and when it is actually needed.
Global.asax:
void Session_Start(object sender, EventArgs e)
{
// No code needed in Session_Start
}
void Session_End(object sender, EventArgs e)
{
if (Session["MyPacksFolder"] != null)
{
// Folder has been created, delete it
// ... add code to delete folder as above
}
}
Somewhere else:
public static void EnsureMyPacksFolder()
{
if (Session["MyPacksFolder"] == null)
{
// Add code to create MyPacksFolder that was previously in Session_Start
Session["MyPacksFolder"] = true;
}
}
Method 2
Did you add the following to your WebMethods?
[WebMethod (EnableSession = true)]
Method 3
If you are creating and deleting folder under your web service path, iis immediatly restarts. Take a look on this post.
All methods was sourced from stackoverflow.com or stackexchange.com, is licensed under cc by-sa 2.5, cc by-sa 3.0 and cc by-sa 4.0