我正在将一个Web应用程序部署到IIS,我的应用程序使用静态字典,它经常从外部api填充。
有时我会观察到词典偶尔被清除了一段时间。我怀疑是因为IIS自动回收。
任何人都可以确认这可能是一个原因吗? 所以基本上我的问题是IIS Recycle会清理webapp正在使用的静态内存吗? (虽然我知道只有在没有与服务器的活动连接时才会发生这种情况)
答案 0 :(得分:0)
如果您查看此MS文章:https://technet.microsoft.com/pl-pl/library/cc753179(v=ws.10).aspx
除了在出现问题时按需回收应用程序池,您还可以配置应用程序池以回收工作进程,原因如下: 在预定的时间
经过一段时间后
达到多项要求后
达到虚拟内存阈值后
达到已用内存阈值后
因此,如果IIS回收不会清理内存回收,那么内存阈值就没有意义了。此外,IIS回收会导致应用程序重新启动,因此它显然也会清除内存。
答案 1 :(得分:0)
是的,默认情况下,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
希望这个答案对你有用。 :)