5

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

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

残念ながら、Application_StartinGlobal.asaxは1回だけ実行されます。つまり、アプリケーションの開始時に実行されます。静止Session_Startしているために望ましくない動作が発生する場所に移動してみました。RoutesTable

RouteTable静的なものを「同期」させたまま、ユーザーがWebページコレクションをオンザフライで変更できるようにするにはどうすればよいですか?

編集

現時点では、私は次のようなことをしています(擬似コード):

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です。これらの変更でRouteTableを更新するにはどうすればよいですか?

4

2 に答える 2

6

usbsnowcrashからの答えは、正しい方向に向かっています。あなたはすでに情報をロードする方法を知っているRouteTableので、そのコードをメソッドに直接ベイクするのではなく、Application_Start呼び出すことができる別のメソッドに入れてください-おそらくのようなものRegisterRoutesです。このメソッドは、初期ロードを実行するためにApplication_Start呼び出します。RegisterRoutesページコレクションに変更を書き込むコードで、更新がコミットされた後、を呼び出しRegisterRoutesてRouteTableをリロードします。

などのスレッドセーフ呼び出しを含める必要がRouteTable.Routes.GetWriteLock()あります。また、データソースからすべてをリロードする前にルートをクリアする必要があります(usbsnowcrashで説明されています)。

この手法は、必要に応じて呼び出すことができるstatic( VBの)メソッドを提供する「Bootstrapper」クラスで使用されるのを見てきました。Shared秘訣はApplication_Start、アプリケーションのライフサイクルだけに依存せずにコードを実行できるように、メソッドとは別のメソッドにすることです。メソッドが呼び出されるたびに最初から開始するように、必ず「クリア」呼び出しを含めてください。

于 2011-02-24T16:07:44.250 に答える
2

RouteTableは置き換えることができます。私がすることは、10分程度ごとにDBをチェックするポーリングイベントがあり、変更が検出された場合は、ルーティングテーブルを置き換えます(このコードをスレッドセーフにするようにしてください)。更新を行うためのコードは次のようになります(AddAllRuleSetsが、データベースからすべてのルールセットを追加するために作成する関数であると想定しています)。

        'somewhat threadsafe
        With System.Web.Routing.RouteTable.Routes
            Using .GetWriteLock()
                routes.Clear()
                'readd routes from your db
                AddAllRulesets()
            End Using
        End With
于 2011-02-19T23:50:41.800 に答える