Webページのコレクションが変更されたときにルーチュテットをリロードする方法は?

StackOverflow https://stackoverflow.com/questions/4905788

質問

私の中で Global.asax 提出します Application_Start 特定の数のルートを作成します RouteTable.Routes データベースから収集されたWebページのリストをループすることにより。これは正常に機能し、すべてのルートが作成され、必要に応じて機能します。しかし、私のWebアプリケーションでは、ユーザーはデータベースを変更して、Webページのコレクションを変更できます。これは、アプリケーションのライフサイクル中に、一部のルートが無効になり、新しいルートを追加する必要があることを意味します。

私がやりたいのは、ユーザーがWebページのコレクションに何かを変更した瞬間、ルーテットをクリアし、(変更された)Webページコレクションを再びループすることでリロードしたいと思います。

残念ながら Application_StartGlobal.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
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top