6

私は、wcf-service データレイヤーを使用して、webshop のような asp.net mvc 4 Web サイトに取り組んでいます。私のアプリケーションは、メインカテゴリ、サブカテゴリ、および製品で構築されています。各製品は 1 つのサブカテゴリにのみ含めることができ、私の URL は次のようになります。

/maincategoryname/subcategoryname/{productid}/producttitle

対応するブレッドクラム トレイル:

ホーム > メインカテゴリー > サブカテゴリー > 商品名

現在、MvcSitemapProvider を使用して、ナビゲーション メニューとブレッドクラムを生成しています。すべての URL をキャッシュなしの動的ノードとしてロードしています。このソリューションはいくつかの製品で機能しますが、1000 個の製品を追加すると、サイトマップの読み込みに 6.5 秒かかります。これは長すぎます。

MvcSitemapProvider でキャッシュをオンにしました。これにより、アプリケーションの読み込みが大幅に高速化されます。しかし、ユーザーが新しい製品を追加し、この新しい製品 (ページ) に移動したとき。キャッシュを使用しているため、URL はまだサイトマップ ファイルに含まれていません。この方法では、ナビゲーションとブレッドクラムは生成されません。

私の質問は:

ユーザーが新しい製品を追加した後、実行時にサイトマップに新しいノードを追加することはできますか?

4

2 に答える 2

5

受け入れられた答えは現在少し古くなっています。MvcSiteMapProvider v4 では、DynamicNodeProvider に GetCacheDescription() メソッドがなくなりました。とにかくこれはうまくいかなかったようです。

データを更新するアクション メソッドで [SiteMapCacheRelease] 属性を使用して、手動でキャッシュを無効化できるようになりました。

[MvcSiteMapProvider.Web.Mvc.Filters.SiteMapCacheRelease]
[HttpPost]
public ActionResult Edit(int id)
{

    // Update the record

    return View();
}

または、静的メソッドを呼び出して:

MvcSiteMapProvider.SiteMaps.ReleaseSiteMap();

フレームワークを拡張して、独自のキャッシュ依存関係を提供するオプションもあります。

于 2013-08-18T11:16:42.560 に答える
0

MvcSiteMapProvider は、キャッシュの依存関係を解決する動的サイトマップを可能にします。

を実装するクラスを作成することで、これを有効にすることができますIDynamicNodeProvider。以下は、データベース クエリに基づいて動的ノードを生成し、同じクエリにキャッシュ依存関係を設定する例です。

public class ProductNodesProvider : IDynamicNodeProvider
{
  static readonly string AllProductsQuery = 
    "SELECT Id, Title, Category FROM dbo.Product;";
  string connectionString = 
        ConfigurationManager.ConnectionStrings ["db"].ConnectionString;

  /// Create DynamicNode's out of all Products in our database
  public System.Collections.Generic.IEnumerable<DynamicNode> GetDynamicNodeCollection()
  {
    var returnValue = new List<DynamicNode> ();

    using (SqlConnection connection = new SqlConnection(connectionString)) {
      SqlCommand command = new SqlCommand (AllProductsQuery, connection);
      connection.Open ();
      SqlDataReader reader = command.ExecuteReader ();
      try {
        while (reader.Read()) {
          DynamicNode node = new DynamicNode (); 
          node.Title = reader [1]; 
          node.ParentKey = "Category_" + reader [2]; 
          node.RouteValues.Add ("productid", reader [0]);

          returnValue.Add (node); 
        }
      } finally {
        reader.Close ();
      }
    }

    return returnValue;
  }

  /// Create CacheDependancy on SQL
  public CacheDescription GetCacheDescription ()
  {
    using (SqlConnection connection = new SqlConnection(connectionString)) {
      SqlCommand command = new SqlCommand (AllProductsQuery, connection);
      SqlCacheDependency dependancy = new SqlCacheDependency (command);

      return new CacheDescription ("ProductNodesProvider")
      {
        Dependencies = dependancy
      };
    }
  }
}

これはすべて非常に気の利いたものであり、顧客がデータベース内の製品を変更したときにキャッシュを無効にする必要がありますが、全体SqlCacheDependancyが複雑になる可能性があり、SQL Server のバージョンに依存します。

CacheDependacyキャッシュを使用して製品を保存している場合は、代わりにカスタムを使用できます。

于 2013-04-23T08:00:37.573 に答える