.net - 当访问间隔时间很长时,使 ASP.NET IIS 网站保持响应

标签 .net asp.net iis

经过多年的 ASP.NET 开发,我实际上很惊讶我似乎无法为此找到令人满意的解决方案。

为什么 IIS ASP.NET 站点在一段时间不事件(几个小时后)后似乎总是进入休眠状态(2-6 秒),在此期间没有 HTTP 响应从服务器发送到客户端。无论设置如何,这都会发生在任何类型的网站上,一页或多页,数据库与否。我怎样才能解决这个问题?

在等待期间,服务器不忙,也没有高峰或 (.NET) 内存短缺。我的猜测是,这与 Windows 将 IIS 进程移至后台并将其内存移至页面文件有关,但我不确定。有人有什么想法吗?

编辑:一种解决方案是每小时左右发送一次 HTTP 请求,但我希望有一些更具 build 性的内容。
编辑:我的意思是:在几个小时不事件后,它会在任何新的 HTTP 请求上暂停几秒钟。

最佳答案

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/");

关于.net - 当访问间隔时间很长时,使 ASP.NET IIS 网站保持响应,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1670344/

相关文章:

.net - Azure存储模拟器连接到未知的sql实例

javascript - 在 AJAX 请求后获取 div 的计数

javascript - 单选按钮名称更改

javascript - jqGrid - 在 IE 中产生 SCRIPT5007 错误,但在本地主机上工作

asp.net-mvc - 第一个Web API session 请求非常慢

.Net 内存限制

.net - Linq 表达式 : The binary operator Equal is not defined for the types 'MyEnum' and 'System.Enum'

c# - 具有多个输入参数的 Linq 表达式

c# - 如何在客户端(使用 javascript)和服务器端(使用 c#)验证 mac 地址和 ip 地址

iis - 使用 WiX IIS 安装程序中的虚拟目录的名称覆盖引用目录的名称