经过多年的ASP.NET开发,我确实很惊讶,我似乎找不到一个令人满意的解决方案。
为什么IIS站点在经过一段时间的不活动(几个小时后)之后似乎总是进入睡眠状态(持续2-6秒),在此期间没有从服务器向客户端发送ASP.NET响应。这发生在任何类型的网站上,一个或多个页面,数据库或非数据库,与设置无关。我该如何解决这个问题呢?
在等待期间,服务器不忙,也不存在高峰或(.NET)内存短缺。我的猜测是,这与Windows将IIS进程移到后台并将其内存移到页面文件有关,但我不确定。有谁知道吗?
编辑:一种解决方案是每小时左右发送一次HTTP请求,但我希望有更有建设性的东西。
编辑:我的意思是:在几个小时的不活动之后,它会在任何新的HTTP请求上暂停几秒钟。
发布于 2009-11-04 05:54:09
IIS的默认超时时间为20分钟。这意味着如果您的ASP.NET应用程序在20分钟内没有接收到任何新请求,它将关闭工作进程。将程序集加载到内存、预编译等将过程从零开始预热可能需要相当长的时间。
(编辑:我组合了一个简单的助手类来解决标准超时问题--基本上,web应用程序经常“戳”自己,以保持进程的活动。理想的方法是更改IIS中的设置,但对于不可能这样做的服务器,我的类工作得很好。-底部的代码)
当工作进程仍然活着的时候,它不应该被剥夺。当然不会像你说的那么快。您可能会依赖于缓存时间非常短的项,并且当它们被请求的时间超过几秒钟时,这些项就会丢失。如果不了解更多关于应用程序的细节,就不可能说出来。
与往常一样,分析您的应用程序是产生具体信息的唯一方法。使用像ANTS这样的产品将帮助您确定应用程序在代码中花费时间最多的位置,因此您可以隔离“挂起”发生的位置。
public class KeepAlive
{
private static KeepAlive instance;
private static object sync = new object();
private string _applicationUrl;
private string _cacheKey;
private KeepAlive(string applicationUrl)
{
_applicationUrl = applicationUrl;
_cacheKey = Guid.NewGuid().ToString();
instance = this;
}
public static bool IsKeepingAlive
{
get
{
lock (sync)
{
return instance != null;
}
}
}
public static void Start(string applicationUrl)
{
if(IsKeepingAlive)
{
return;
}
lock (sync)
{
instance = new KeepAlive(applicationUrl);
instance.Insert();
}
}
public static void Stop()
{
lock (sync)
{
HttpRuntime.Cache.Remove(instance._cacheKey);
instance = null;
}
}
private void Callback(string key, object value, CacheItemRemovedReason reason)
{
if (reason == CacheItemRemovedReason.Expired)
{
FetchApplicationUr();
Insert();
}
}
private void Insert()
{
HttpRuntime.Cache.Add(_cacheKey,
this,
null,
Cache.NoAbsoluteExpiration,
new TimeSpan(0, 10, 0),
CacheItemPriority.Normal,
this.Callback);
}
private void FetchApplicationUrl()
{
try
{
HttpWebRequest request = HttpWebRequest.Create(this._applicationUrl) as HttpWebRequest;
using(HttpWebResponse response = request.GetResponse() as HttpWebResponse)
{
HttpStatusCode status = response.StatusCode;
//log status
}
}
catch (Exception ex)
{
//log exception
}
}
}用法(可能在App_Start中):
KeepAlive.Start("http://www.yoursite.com/");发布于 2010-05-26 20:28:10
如果您使用的是IIS 7,IIS团队提供了一个名为Application Warm的IIS插件,它将帮助您保持良好的状态
我写了一个关于我使用它的经验的blog post。
发布于 2010-06-01 16:31:01
如果您目前只是在后面编译代码,那么您可能还希望在编译时(而不是默认的运行时)查看预编译aspx文件。我相信,当一个休眠的ASP.NET站点被唤醒时,这种动态编译占据了大部分时间。你可以阅读更多关于它的here。
更新:
当达到IdleTime-Out值时,应用程序池将被终止-此默认值为20分钟(您可以更改此值)。你确定在这种情况下应用重启后UI不会被重新编译吗?(我不确定它是否会强制重新编译UI )。
https://stackoverflow.com/questions/1670344
复制相似问题