5

tl;dr: MvcSiteMapProvider のメニューは、ページの更新後にコードが実行されてメニューがレンダリングされる場合でも、アプリケーションがオンラインに戻った後にレンダリングに失敗することがあります。

ASP.NET MVC 3 プロジェクトで MvcSiteMapProvider を使用していますが、アプリをオフラインからオンラインに切り替えた後 (App_Offline.htmサーバーのルートにファイルを挿入して削除することにより)、ページが更新されるまでメニューが何もレンダリングされないことがあります。

カスタムの DynamicNodeProvider を使用して、データベースからメニュー項目を照会し、メニューをレンダリングしています。デバッグ中に、ページがロードされる前にこのコードが実際に実行されていることがわかりますが、ページにメニューがレンダリングされていません。キャッシュを数時間に設定し、カスタム キャッシュ キーを使用して、特定のアクションの後に無効化できるようにしています。

残念ながら、このエラーを一貫して再現することはできません。ただし、DynamicNodeProvider の先頭にスリープを追加すると、より頻繁に再現できます。30 秒以上のスリープで約 60 ~ 70% の確率で失敗ますこれまでのところ、キャッシュ期間を 0 に設定しても問題がないように見え、メニューが常にポップアップするため、キャッシュメカニズムに関係している可能性があります。ただし、問題の特定が難しいため、断言することは困難です。0 のままにしておくことは、パフォーマンスが低下するため、受け入れられる解決策ではありません。

この問題の根本的な原因は何ですか? 誰かが以前にこの動作を見たことがありますか、または回避策がありますか?

4

2 に答える 2

2

MvcSiteMapProvider は、特に大きなサイトマップ定義がある場合に、ASP.NET SiteMapProvider のスレッド モデルに噛まれることがあります。現在、この動作に対する回避策はありませんが、重い条件下でより安定するように書き直す (そして ASP.NET SiteMapProvider 依存関係を捨てる) ことを計画しています。

于 2012-11-20T07:08:45.317 に答える
1

MvcSiteMapProvider v4 がリリースされ、NuGet で利用できます

これは、以前よりも構成可能で拡張性の高い独自のキャッシュ メカニズムを使用します。これまでのところ、v4 では、メニューが消えたり、その他の最初の要求のみに関する奇妙な問題の報告はありません。

于 2013-08-18T10:11:34.420 に答える