2016-03-22 161 views
0

我正在將一個Web應用程序部署到IIS,我的應用程序使用靜態字典,這是經常從外部api填充的。iis回收是否清理內存?

有時我觀察到詞典正在被清除一次&我懷疑這是因爲IIS自動回收。

任何人都可以請確認這可能是一個原因嗎? 所以基本上我的問題是IIS回收會清理Web應用程序使用的靜態內存? (雖然我知道,當有與服務器的任何活動連接,這隻會發生)

回答

0

如果你看看這個MS文章:https://technet.microsoft.com/pl-pl/library/cc753179(v=ws.10).aspx

除了發生問題時回收一個應用程序池按需,您可以配置一個應用程序池回收工作進程,原因如下: 在預定的時間

  • 經過時間後

  • 達到數量要求

  • 的達到虛擬內存閾值

  • 達到使用內存閾值

後後後,所以,如果IIS回收不會清理內存回收它在內存門檻上是沒有意義的。此外,IIS回收會導致應用程序重新啓動,因此它顯然也會清除它的內存。

1

是的,默認情況下,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

希望這個答案對你有用。 :)