2

よくあることですが、残念ながらもう1つの問題の良い解決策があります。データベースエントリに基づく動的ルーティング

私たちは、さまざまな組織のメンバー、大規模な親の一部にサービスを提供するアプリを持っています。組織にはカスタムURLが必要です。したがって、org AのメンバーはURL https://server/vdir/OrgAにアクセスし、org BのメンバーはURL https://server/vdir/OrgBにアクセスします。

これらはどちらも、カスタム表示コンテンツのためにエンドユーザーとは異なるように見えるかもしれませんが、どちらもアプリケーション内の全く同じ領域、コントローラ、およびアクションにマッピングされます。

このアプリを使用している組織のリストは動的であり、すべての組織で同時に使用するわけではないため、プログラムでルートマッピングを設定するようになりました。ターゲットエリアでは、RegisterAreaメソッドをオーバーライドし、アクティブな組織をデータベースから取得し、それぞれに対してカスタムcontext.MapRouteコールを実行します。

組織のサイトパス(「OrgA」)を持つURLが、意味のあるエリア名を持つURLとまったく同じように見える、実際にはエリアにマップされるという別の問題が回避されます。組織のサイトパスをバーチャルエリア名として扱い、ターゲットエリアに明示的にマッピングすることで、誤った指示が回避されました。

これはうまく動作します。しかし、それはすべてApplication_Startで実行されます。組織を追加すると、アプリを再起動するまでアクティブにならないため、その時点でそれを使用していた人にとっては非常に混乱します。

だから私の質問は2つです:

  1. これを行うための私よりもっと良い方法はありますか?私はこの問題を研究しましたが、関連するキーワードは非常に偏在していて、ちょっとした針と草地の状況でした。
  2. がない場合は、アプリを再起動せずにルートマッピングを更新する方法がありますか?

答えて

2

フィル・ハークは記事dealing with exactly this problemを書きました。

本当に短いバージョンは、Global.asax以外のファイルにルート登録を配置し、そのファイルの内容をキャッシュすることです。キャッシュはファイルを依存関係として持ち、ルートが再登録されるキャッシュが無効になったとき(読み込み:ファイルが変更されたとき)にメソッドを呼び出します。

+0

私のケースでは、SQL Serverの依存関係に基づいて何かをしようとしていると思います。組織のキャッシュが無効にされ、更新されると、ルートが再登録されます。しかし原則は同じです。記事へのポインタありがとう! –

関連する問題