Webページのコレクションが変更されたときにルーチュテットをリロードする方法は?
-
29-10-2019 - |
質問
私の中で Global.asax
提出します Application_Start
特定の数のルートを作成します RouteTable.Routes
データベースから収集されたWebページのリストをループすることにより。これは正常に機能し、すべてのルートが作成され、必要に応じて機能します。しかし、私のWebアプリケーションでは、ユーザーはデータベースを変更して、Webページのコレクションを変更できます。これは、アプリケーションのライフサイクル中に、一部のルートが無効になり、新しいルートを追加する必要があることを意味します。
私がやりたいのは、ユーザーがWebページのコレクションに何かを変更した瞬間、ルーテットをクリアし、(変更された)Webページコレクションを再びループすることでリロードしたいと思います。
残念ながら Application_Start
の Global.asax
つまり、アプリケーションの開始時には一度だけ実行されます。私はそれを移動しようとしました Session_Start
これにより、必要に応じて動作が生じます RoutesTable
静的であること。
静的を持っている間、ユーザーにWebページコレクションをオンザフライで変更する機能を提供するにはどうすればよいですか RouteTable
それには「インシンク」のままですか?
編集
現時点では、私はこのようなことをします(擬似コード):
public class WebPageInfo // represents a record in the database
{
public string Title; // My nice page
public string Url; // NicePage
public string PhysicalFile; // ~/Page.aspx
}
Global.asax:
protected virtual void Application_Start(object sender, EventArgs e)
{
foreach (WebPageInfo webPageInfo in webPageInfos)
{
RouteTable.RegisterRoute(webPageInfo.Title, webPageInfo.Url, webPageInfo.PhysicalFile);
}
}
問題は、アプリケーションのライフサイクル中に、ユーザーがレコードを追加/変更/削除できることです。 webPageInfos
, 、これらの変更でルーテンタブルを更新するにはどうすればよいですか?
解決
からの答え usbsnowcrash 正しい方向に向かっています。あなたはすでにロードする方法を知っています RouteTable
情報なので、そのコードを直接焼くのではなく Application_Start
方法、それを呼ぶことができる別のメソッドに入れます - おそらくのようなもの RegisterRoutes
. 。 Application_Start
メソッドは呼び出します RegisterRoutes
初期負荷を実行します。ページコレクションの変更を書き込むコードで、更新がコミットされた後、電話してください RegisterRoutes
ルーテンテーブルをリロードします。
次のようなスレッドセーフティコールを含める必要があります RouteTable.Routes.GetWriteLock()
また、データソースからすべてをリロードする前に、ルートをクリアしたいと思います( usbsnowcrash).
私は、「ブートストラッパー」クラスで使用されているこの手法を見てきました。 static
(Shared
必要に応じて呼び出すことができるvb)方法。秘trickは、それを別の方法にすることです Application_Start
方法で、アプリケーションのライフサイクルだけに依存せずにコードを実行できるようにします。メソッドが呼び出されるたびに、「クリア」呼び出しをゼロから開始するための「クリア」呼び出しを含めてください。
他のヒント
ルーチャブルを交換できます。私がやることは、10分ごとにDBをチェックする投票イベントがあり、変更が検出された場合はルーティングテーブルを交換することです(このコードスレッドセーフを作成してください)。コードがアップデートを実行するために見えるかもしれないものは次のとおりです(AddallRuleSetsがDBからすべてのルールセットを追加するために記述する関数であると仮定します)。
'somewhat threadsafe
With System.Web.Routing.RouteTable.Routes
Using .GetWriteLock()
routes.Clear()
'readd routes from your db
AddAllRulesets()
End Using
End With