2017-02-17 7 views
0

次のコードをキャッシュする最良の方法は何ですか。したがって、データはデータベースから一度読み込まれ、毎回キャッシュから提供されますか?Webサービスでの結果文字列またはLinqクエリのキャッシュ方法C#

複数のドメインから1日に何千回もアクセスされます。私はまた、おそらくピクチャをリフレッシュする必要があるときにキャッシュをクリアできるようにしたい。

// GETAll api/category 
    [WebMethod(CacheDuration = 600)] 
    public string GetAllCategories() 
    { 

     using (var db = new nopMass()) 
     { 
      var cats = db.Categories 
         .Where(x => x.ParentCategoryId == 1 
            && x.Deleted == false 
            && x.Published == true) 
         .OrderBy(c => c.ParentCategoryId) 
         .ThenBy(c => c.DisplayOrder) 
         .AsEnumerable() 
         .Select(cat => new Category 
         { 
          Id = cat.Id, 
          Name = cat.Name, 
          Description = cat.Description, 
          MetaKeywords = cat.MetaKeywords, 
          MetaDescription = cat.MetaDescription, 
          MetaTitle = cat.MetaTitle, 
          PictureId = cat.PictureId, 
          DisplayOrder = cat.DisplayOrder, 
          CreatedOnUtc = cat.CreatedOnUtc, 
          Product_Category_Mapping = cat.Product_Category_Mapping, 
          ParentCategoryId = cat.ParentCategoryId, 
         }) 
         .ToList(); 

      string XML = ""; 

      XML += "<Collection>"; 
      foreach (var item in cats) 
      { 
       XML += "<Category>"; 

       XML += "<Id>"; 
       XML += item.Id.ToString(); 
       XML += "</Id>"; 

       XML += "<Name>"; 
       XML += item.Name; 
       XML += "</Name>"; 

       XML += "<Description>"; 
       XML += item.Description; 
       XML += "</Description>"; 

       XML += "<MetaKeywords>"; 
       XML += item.MetaKeywords; 
       XML += "</MetaKeywords>"; 

       XML += "<MetaDescription>"; 
       XML += item.MetaDescription; 
       XML += "</MetaDescription>"; 

       XML += "<MetaTitle>"; 
       XML += item.MetaTitle; 
       XML += "</MetaTitle>"; 

       XML += "<PictureUrl>"; 
       try 
       { 
        XML += GetPictureUrl(item.PictureId); 
       } 
       catch { } 
       XML += "</PictureUrl>"; 

       XML += "<DisplayOrder>"; 
       XML += item.DisplayOrder.ToString(); 
       XML += "</DisplayOrder>"; 

       XML += "<CreatedOnUtc>"; 
       XML += item.CreatedOnUtc.ToString(); 
       XML += "</CreatedOnUtc>"; 

       XML += "<ParentCategoryId>"; 
       XML += item.ParentCategoryId.ToString(); 
       XML += "</ParentCategoryId>"; 

       XML += "</Category>"; 
      } 
      XML += "</Collection>"; 

      return XML; 

     } 
    } 
+0

IMHO使用xmlseralizationではなく、手でコード化されたXMLを動作するはずやりなさいhttp://stackoverflow.com/questions/4123590/serialize-an-object- to-xml – Eldho

+0

IISを使用してイメージが提供されると、デフォルトでキャッシュされます.URLを変更すると、新しいファイルになり、ロードされます。同じ名前のファイルを変更しても、最後に変更されたプロパティを使用してブラウザにロードされます。その後、キャッシュされます。 また、ブラウザのローカルストレージを利用することもできます – Eldho

+0

Linqクエリの結果をキャッシュする方法はありますか?したがって、それぞれのリクエストで同じ結果をフェッチする必要はありませんか? – Orion

答えて

2

あなたはおよそ次のようになります。 HttpRunTime.Cache

まず第一に、あなたは、このようにキャッシュするために書く:

HttpRuntime.Cache.Insert(cacheKey, yourListOfObjects, null, DateTime.Now.AddMinutes(10), System.Web.Caching.Cache.NoSlidingExpiration, System.Web.Caching.CacheItemPriority.Normal, null); 

このコードは、10分間のデータを保持しています。単純にすることができますキャッシュをクリアするには

List<Categories> cats = (List<Categories>)ReadFromCache(cachekey); 
if(cats == null) 
{ 
    //your code to fetch 
} 

:あなたはこのようにキャッシュから読み取ることができますあなたのコードに基づいて

public object ReadFromCache(string cacheKey) 
    { 

      if (HttpRuntime.Cache[cacheKey] != null) 
      { 
       var cache = HttpRuntime.Cache[cacheKey]; 

       if (cache != null) 
        return cache; 
      } 
      return null; 

    } 

:あなたは、このメソッドを使用することができますキャッシュからの読み込みに

foreach (System.Collections.DictionaryEntry cacheItem in HttpRuntime.Cache) 
       { 
        HttpRuntime.Cache.Remove(cacheItem.Key.ToString()); 
       } 

これが役に立ちます。

注: 私はシリアル化を参照してください、これをテストしたが、それは

+0

簡単な説明をありがとうございます! – Orion

関連する問題