2016-09-15 20 views
0

私はちょうどASP.NET MVCプロジェクトにスローされ、データベースのフラグがtrueに設定されているときに表示される「オフライン」ページを作成するように任されました。私は値をチェックし、それが本当であれば、私はサイト全体を任意の要求に対してオフラインにしたい。 ActionFilterを最後に作り、すべてのリクエストに追加しました。次に、ページが要求されると、Iはそれに応じてフィルタリングされます。しかし、これはオフラインページ自体もフィルタリングします。そのため、オフラインページかどうかを確認する行を作成しました。問題は、ログインページが次のように転送されていることです:/ Account/Login?ReturnUrl =%2FOffline、これはログインページの表示を終了します。この問題を解決するにはどうすればよいですか?ASP.NET MVC「オフライン」Page

public class DownForMaintenanceActionFilter : ActionFilterAttribute, IActionFilter 
    { 
     public DownForMaintenanceActionFilter() 
     { 
     } 

     void IActionFilter.OnActionExecuting(ActionExecutingContext filterContext) 
     { 
      // If they are actually visiting the Offline page already, abort. 
      if (HttpContext.Current.Request.RawUrl.Contains("Offline")) 
      { 
       this.OnActionExecuting(filterContext); 
       return; 
      } 

      // We want to go to the "Down For Maintenance" Page if any of the following is true: 
      bool siteIsUp = true; 

      // Some other code here that sets siteIsUp = false 

      if (!siteIsUp) 
       RedirectToMaintenancePage(filterContext); 
      else 
       this.OnActionExecuting(filterContext); 
     } 


     private void RedirectToMaintenancePage(ActionExecutingContext filterContext) 
     { 
      filterContext.Result = new RedirectToRouteResult(
       new RouteValueDictionary 
       { 
        { "controller", "Offline" }, 
        { "action", "Index" } 
       }); 
     } 
    } 

私は何をしたいのですか?これが最善のアプローチですか? また、サイトでない場合に、このページにアクセスするのを防ぐにはどうすればよいですか?ありがとう!

+1

ウェブサイトにapp_offline.htmを追加または削除するバッチファイルを作成する方が良いですか? – lordkain

+0

何も知らないクライアントのために自動化する必要があります。 – skaz

答えて

0

あなたの現在のアプローチは、ルーティングでうまく行かないために脆いです。ルートは、コントローラ/メソッド名をそれらに到達するために使用されたURLから切り離すことができます。したがって、道を辿ることで賢明になると、この方法は失敗します。

私は属性でDownForMaintenanceActionFilter(ところで、大会は、それが実際にDownForMaintenanceActionFilterAttributeを命名されるべきであると述べている)普遍的、そして第二Attribute(最小限の実装とIgnoreDownForMaintenanceAttributeのようなもの)を作成し、タグ付け、あなたのOfflineコントローラ/メソッドを適用していることを確実にするでしょうDownForMaintenanceActionFilterはその存在をチェックし、それに応じて行動します。

filterContext.ActionDescriptor propertyをご覧ください。 IIRCでは、必要な情報のほとんどがすでに収集されています。

アクションメソッド(名前、コントローラ、パラメータ、属性、フィルタなど)に関する情報を提供します。

無関係:普遍的に適用されているActionFilterを作成していた場合は、すべてのリクエストでDBを打つことに非常に注意が必要です。特定の時間の値をキャッシュする価値があるかもしれませんので、DBへの接続頻度は低くなります。