2016-03-22 9 views
0

私はIISにデプロイされたWebアプリケーションを持っていますが、私のアプリは頻繁に外部APIから埋め込まれた静的辞書を使用しています。iisリサイクルはメモリを清掃しますか?

時々、私は辞書が一度消去されているのを観察します。& IIS自動リサイクルが原因だと思われます。

誰でもこれが理由である可能性があることを確認できますか? 基本的に私の質問は、IISのリサイクルは、Webアプリケーションが使用している静的メモリをクリーンアップするでしょうか?あなたは、このMSの記事を見れば

答えて

0

を(私は、サーバーへのアクティブな接続がない場合にのみ起こるだろうことを理解しますが):問題が発生したときにオンデマンドでアプリケーションプールをリサイクルすることに加えてhttps://technet.microsoft.com/pl-pl/library/cc753179(v=ws.10).aspx

経過時間後に予定された時間に

  • :あなたは、次の理由でワーカープロセスをリサイクルするアプリケーションプールを構成することができますIISのリサイクルは、メモリのリサイクルをクリーンアップしませんので、もし使用されるメモリのしきい値

に到達した後、仮想メモリのしきい値

  • に到達した後の要求

  • の数に到達した後210

  • それはメモリのしきい値で意味をなさないだろう。さらに、IISリサイクルが原因でアプリケーションが再起動するため、明らかにメモリもクリアされます。

  • 1

    はい、既定でIISはガベージコレクタを呼び出して20分ごとにメモリをクリアすることによって、アプリケーションプールをリサイクルします。

    アイドルタイムアウトの設定は、アプリケーションプール - >詳細設定で表示されますが、変更しない方が良いです。

    すべての静的なものは「悪い」です。使用しないでください。あなたのオプションはキャッシュされています。デフォルトのMVCキャッシュを使用しているスレッドを安全にする汎用キャッシュサービスを作成することができます。

    子アクションコントローラで[OutputCache]属性を使用して分を設定することもできます。この間隔の間にデータがキャッシュされます

    または独自のキャッシュロジックを実装できます。

    すべての3つの点から、最初の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

    ホープ、この答えはあなたに有用であることを仮定しよう。 :)

    関連する問題