我正在将一个Web应用程序部署到IIS,我的应用程序使用静态字典,这是经常从外部api填充的。iis回收是否清理内存?
有时我观察到词典正在被清除一次&我怀疑这是因为IIS自动回收。
任何人都可以请确认这可能是一个原因吗? 所以基本上我的问题是IIS回收会清理Web应用程序使用的静态内存? (虽然我知道,当有与服务器的任何活动连接,这只会发生)
我正在将一个Web应用程序部署到IIS,我的应用程序使用静态字典,这是经常从外部api填充的。iis回收是否清理内存?
有时我观察到词典正在被清除一次&我怀疑这是因为IIS自动回收。
任何人都可以请确认这可能是一个原因吗? 所以基本上我的问题是IIS回收会清理Web应用程序使用的静态内存? (虽然我知道,当有与服务器的任何活动连接,这只会发生)
如果你看看这个MS文章:https://technet.microsoft.com/pl-pl/library/cc753179(v=ws.10).aspx
除了发生问题时回收一个应用程序池按需,您可以配置一个应用程序池回收工作进程,原因如下: 在预定的时间
经过时间后
达到数量要求
的达到虚拟内存阈值
达到使用内存阈值
后后后,所以,如果IIS回收不会清理内存回收它在内存门槛上是没有意义的。此外,IIS回收会导致应用程序重新启动,因此它显然也会清除它的内存。
是的,默认情况下,IIS通过调用垃圾回收器每20分钟清空内存来回收您的应用程序池。
您可以在应用程序池中看到空闲超时设置 - >高级设置,但最好不要更改它。
所有静态的东西都是“坏”不要使用它们,你的选择是缓存。您可以制作一个通用缓存服务,该服务使用默认的MVC缓存并使线程安全。
您还可以使用子动作控制器上的[OutputCache]属性并设置分钟。在此间隔之间数据将被缓存
或者您可以实现自己的缓存逻辑。
从所有三件事我会建议你第一个使用默认的MVC缓存。我将为您提供一个样本实现得益于#TelerikAcademy和#NikolayKostov
namespace Eshop.Services.Common
{
using System;
using System.Web;
using System.Web.Caching;
using Contracts;
public class HttpCacheService : IHttpCacheService
{
private static readonly object LockObject = new object();
public T Get<T>(string itemName, Func<T> getDataFunc, int durationInSeconds)
{
if (HttpRuntime.Cache[itemName] == null)
{
lock (LockObject)
{
if (HttpRuntime.Cache[itemName] == null)
{
var data = getDataFunc();
HttpRuntime.Cache.Insert(
itemName,
data,
null,
DateTime.Now.AddSeconds(durationInSeconds),
Cache.NoSlidingExpiration);
}
}
}
return (T)HttpRuntime.Cache[itemName];
}
public void Remove(string itemName)
{
HttpRuntime.Cache.Remove(itemName);
}
}
}
它的用法是用匿名函数和时间间隔
您可以将其设置为一个受保护的超级简单基本控制器的属性,并在您使用的每个控制器中继承BaseController。比你将不得不在每个控制器缓存服务,你可以简单地使用它的方式
var newestPosts = this.Cache.Get(
"newestPosts",
() => this.articlesService.GetNewestPosts(16).To<ArticleViewModel().ToList(),
GlobalConstants.DefaultCacheTime);
让我们假设GlobalConstants.DefaultCacheTime = 10
希望这个答案对你有用。 :)