Can you prevent your ASP.NET application from shutting down?

I think I heard that ASP.NET applications will shut down after a while of being idle (i.e. no visitors).

Is there a way to prevent this behavior from happening? I have a timer that runs some code from the global.asax.cs application_start event, and want to make sure that it continues to run, even when no visitors are hitting the site.

Thanks in advance!

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

You can do it a few ways.

  1. If you have control over IIS, you can change the “Idle Timeout” within the application pool, by default it is 20 minutes.
  2. If you do NOT have control over IIS (Shared or other hosting), you can use an external service to ping the site. MyWebKeepAlive or Pingdom are good options for this.

If you are under option two, I strongly recommend an external source, as it is less to manage, and if you don’t have IIS available to configure, you most likely don’t have the server available to add a ping application to.

In addition, I do not recommend something that sits in-process with the web application, as I have found that those can cause issues when the application really does need to recycle…

One last thought

If you do go the route of modifying the IIS Idle timeout, I do recommend setting a regular recycle of the application pool. As many web applications do benefit from a periodic recycle, and most commonly the idle timeout is the biggest regular recycle factor.

Method 2

Besides external keep alive you can make an internal keep alive inside global.asax:

    static Thread keepAliveThread = new Thread(KeepAlive);

    protected void Application_Start()
    {
        keepAliveThread.Start();
    }

    protected void Application_End()
    {
        keepAliveThread.Abort();
    }

    static void KeepAlive()
    {
        while (true)
        {
            WebRequest req = WebRequest.Create("http://www.mywebsite.com/DummyPage.aspx");
            req.GetResponse();
            try
            {
                Thread.Sleep(60000);
            }
            catch (ThreadAbortException)
            {
                break;
            }
        }
    }

Method 3

In IIS 6, go to the Application Pools section, and right-click > Properties on the pool which hosts the ASP.NET application in question. Go to the Performance tab and uncheck “Shutdown worker processes after being idle for:”

In IIS 7, go to the Connections pane and find Application Pools, and select Advanced Settings for the pool which hosts your application. Find the “Idle Timeout” property and set it to “0” (this disables it).

The default is 20 minutes of inactivity. By unchecking the box, once your AppDomain is loaded by the worker process, it will never die (unless you kill the process or something of course). By default, IIS will recycle the process when it reaches some limit, such as a memory cap, but it will also start a new one and “phase over” all incoming requests until the old one is unused, so as to minimize disruption.

If you do not have direct control over your IIS configuration (shared host, for example) your best bet is to have a small application running on a separate system – say, an always-on workstation – which hits your site every x minutes to keep the application pool from timing out. Nothing fancy – a simple WebRequest and a while() loop in a console application will do.

Method 4

Go to your task manager and kill w3wp.exe (or aspnet_wp). Nothing can stop you from doing this. Bottom line, ASP.NET applications cannot assume continuous functionality.

However, you can launch a separate thread, which will not be subject to idle timeouts — as long as it has something to do. I’ve used this technique to control a 45-minute import that would continue whether or not anyone was on the web site. I used a transaction log and Application_Start so that when the process was recycled, it would pick up where it left off.


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

0 0 votes
Article Rating
Subscribe
Notify of
guest

0 Comments
Inline Feedbacks
View all comments
0
Would love your thoughts, please comment.x
()
x