IIS 10 Application Pool fall a sleep

痞子三分冷 提交于 2020-12-02 05:59:49

问题


We have ASP.NET Core application used internally which are used during office hours and a batch that should be processed 3 AM every morning which is scheduled by HangFire like this:

RecurringJob.AddOrUpdate(
                () => MyBatch(),
                "0 0 3 1/1 *");

The problem is that the Application Pool goes to sleep and the batch isn’t processed if the site isn’t manually started (by going to the website usually).

I have searched SO and tampered with these settings in the Application Pool but with no success:

Some sources that I used to modify the settings:

  • How to prevent/extend idleTimeout in IIS 7?
  • https://serverfault.com/questions/443065/how-do-i-prevent-iis-8-from-stopping-idle-asp-net-applications
  • IIS seems like to sleep until the next request

The Application Pool is used by a total of 7 applications (all being inactive during night when the batch should be processed). The used Application Pool uses .NET CLR Version 2.0. I'm using IIS version 10.0.17134.1.

How can I make the Application Pool stay active so the batch can be invoked regularly every morning?


回答1:


I ran into the same issue where my ASP.NET core application goes into idle even with "AlwaysRunning" as start mode for the app pool, "Preload Enabled" set to true for the site, and idle timeout set to 0. I got it to work by installing the Application Initialization module and setting the .NET CLR version to v4.0. Don't use the "No Managed Code" as that would prevent the Always Running from triggering the app start.

I wrote a blog post on this explaining in more details the steps I took to get the app to run continuously.




回答2:


They got documentation on how to set up service to run without stopping.

http://docs.hangfire.io/en/latest/deployment-to-production/making-aspnet-app-always-running.html#enabling-service-auto-start

My experience (with older IIS versions 7.5, 8.0) is that it works, but not for app pool recycle/domain unload. Workaround for me was to send init request on the application_end event.




回答3:


As above - you need to enable the Service Autostart - in addition to this, if you hit multiple exceptions, I have found that the Rapid Fail Protection has shut down Application pools in the past when using HangFire. So it's also worth disabling (or increasing to reasonable limits) this on the application pool.




回答4:


I'd suggest you put in your process a single call to the HTTP address first, just like a ping, that would be enought to trigger the site startup if it isn't running for some reason.

One other thing is that, by microsoft's description at MSDN the "AlwaysRunning" option would be:

"Specifies that the Windows Process Activation Service (WAS) will always start the application pool. This behavior allows an application to load the operating environment before any serving any HTTP requests, which reduces the start-up processing for initial HTTP requests for the application."

That may be, to produce the compilation of web pages that is done on the first call to be done before any request coming, but may not actually run the application at all times.




回答5:


I am on a Shared IIS Hosting with no access to most settings. What I did is add a Recurring Job that would be triggered in minute interval less than the IIS Timeout/Idle.

RecurringJob.AddOrUpdate<IMyKeepAliveService>("KeepHangFireAlive", svc => svc.KeepHangFireAlive(URL_TO_SELF), "*/4 * * * *");

The above CRON is enough to prevent IIS App pool from going to sleep. I use RestSharp to make a tiny ping/GET request to "Self".



来源:https://stackoverflow.com/questions/51348433/iis-10-application-pool-fall-a-sleep

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