首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >当访问间隔时间较长时,保持ASP.NET IIS网站的响应能力

当访问间隔时间较长时,保持ASP.NET IIS网站的响应能力
EN

Stack Overflow用户
提问于 2009-11-04 05:47:53
回答 3查看 6.5K关注 0票数 11

经过多年的ASP.NET开发,我确实很惊讶,我似乎找不到一个令人满意的解决方案。

为什么IIS站点在经过一段时间的不活动(几个小时后)之后似乎总是进入睡眠状态(持续2-6秒),在此期间没有从服务器向客户端发送ASP.NET响应。这发生在任何类型的网站上,一个或多个页面,数据库或非数据库,与设置无关。我该如何解决这个问题呢?

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

编辑:一种解决方案是每小时左右发送一次HTTP请求,但我希望有更有建设性的东西。

编辑:我的意思是:在几个小时的不活动之后,它会在任何新的HTTP请求上暂停几秒钟。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2009-11-04 05:54:09

IIS的默认超时时间为20分钟。这意味着如果您的ASP.NET应用程序在20分钟内没有接收到任何新请求,它将关闭工作进程。将程序集加载到内存、预编译等将过程从零开始预热可能需要相当长的时间。

(编辑:我组合了一个简单的助手类来解决标准超时问题--基本上,web应用程序经常“戳”自己,以保持进程的活动。理想的方法是更改IIS中的设置,但对于不可能这样做的服务器,我的类工作得很好。-底部的代码)

当工作进程仍然活着的时候,它不应该被剥夺。当然不会像你说的那么快。您可能会依赖于缓存时间非常短的项,并且当它们被请求的时间超过几秒钟时,这些项就会丢失。如果不了解更多关于应用程序的细节,就不可能说出来。

与往常一样,分析您的应用程序是产生具体信息的唯一方法。使用像ANTS这样的产品将帮助您确定应用程序在代码中花费时间最多的位置,因此您可以隔离“挂起”发生的位置。

代码语言:javascript
复制
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中):

代码语言:javascript
复制
KeepAlive.Start("http://www.yoursite.com/");
票数 6
EN

Stack Overflow用户

发布于 2010-05-26 20:28:10

如果您使用的是IIS 7,IIS团队提供了一个名为Application Warm的IIS插件,它将帮助您保持良好的状态

我写了一个关于我使用它的经验的blog post

票数 1
EN

Stack Overflow用户

发布于 2010-06-01 16:31:01

如果您目前只是在后面编译代码,那么您可能还希望在编译时(而不是默认的运行时)查看预编译aspx文件。我相信,当一个休眠的ASP.NET站点被唤醒时,这种动态编译占据了大部分时间。你可以阅读更多关于它的here

更新:

当达到IdleTime-Out值时,应用程序池将被终止-此默认值为20分钟(您可以更改此值)。你确定在这种情况下应用重启后UI不会被重新编译吗?(我不确定它是否会强制重新编译UI )。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1670344

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档