Responseの効率的な使用Redirect

7148 ワード

紹介:
ASPを評価しています.NET Webプロジェクトアプリケーション.拡張性の問題があります.Webサイトへのアクセスが増加するという意味です.システムは遅くなります.アプリケーションログを表示すると.大量のThreadAbortExceptionを見つけましたこの応用はResponse.Redirect(はいendResponse=true)を多く用いており,これが拡張性問題の根源である.endResponse=falseでResponse.Redirectはこの問題を解決します.しかし、このようにすると、アプリケーションに奇妙な問題が発生します.アプリケーションはResponseにあると仮定するからです.Redirectは現在のページで実行を停止します.それ以外に、アプリケーションがページイベントがリダイレクトを実行しないと仮定した後、セキュリティ上の危険性を処理する必要があります.この記事では、これらの問題を解決し、パフォーマンスを向上させるための簡単な方法について説明します.
説明:
例えば、Webフォームがあります.いくつかの条件を検証し、条件が一致しないときにユーザーにリダイレクトしてジャンプする必要があります.
1
2
3
4
5
6
7
8
9
10
11
12protected void Page_Load( object sender, EventArgs e)          {              var condition = ......;              if (!condition)              {                  Response.Redirect( "SomePage.aspx" );              }          }          protected void btnSave_Click( object sender, EventArgs e)          {              // Save Data Here          }これは良いですが、拡張性に影響します.スレッドプールが終了するからです.今は、Responseを使うだけです.Redirect(「Unauthorized.aspx」,false)はResponseを置換する.Redirect("Unauthorized.aspx") . これにより、スレッドが終了する問題が解決するが、現在のページのライフサイクルは停止しない.つまり、btnSaveを確保する必要があります.Clickイベント(および他のすべてのページ時間)btnSave_を許可する限りClickイベント実行は誰でも簡単にPOST要求を送信ことができる.この問題を解決するためにRedirectUser拡張を使用することをお勧めします.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33public static class HttpResponseExtensions      {          public static void RedirectUser( this HttpResponse response, string url)          {              if (response.IsRequestBeingRedirected)                  return ;              response.Redirect(url, false );              var context = HttpContext.Current;              if (context != null )              {                  context.ApplicationInstance.CompleteRequest();              }          }      }      public partial class WebForm : System.Web.UI.Page      {          protected void Page_Load( object sender, EventArgs e)          {              var condition = .....;              if (!condition)              {                  Response.RedirectUser( "Unauthorized.aspx" );              }          }          protected void btnSave_Click( object sender, EventArgs e)          {              if (Response.IsRequestBeingRedirected)              {                  return ;              }              // Save Data Here          }      }RedirectUserを使用する最初の利点は、アプリケーションの拡張性に優れたResponseを最初に使用することです.Redirect(with endResponse=false)メソッド.2つ目の利点は、このメソッドを複数回呼び出した後、以前のResponseを上書きしないことです.Redirect3つ目の利点は、ASPを処理するためにHttpApplication.CompleteRequestを呼び出すことである.NET実行時に通過する全てのイベント及びHTTPパイプ情報(ページライフサイクルパイプ情報ではない)をフィルタリングする.またbtnSaveではClickイベントでResponseをチェックする.IsRequestBeingRedirected.私もあなたがすべての内部統制をResponseに置くことを望んでいます.IsRequestBeingRedirectedチェック、
1
2
3
4
5
6
7
8< form id = "form1" runat = "server" >          <% if(!Response.IsRequestBeingRedirected){ %>              < asp:Button ID = "btnSave" runat = "server" Text = "Save" OnClick = "btnSave_Click" />              <%--All the Other Controls--%>              <%--All the Other Controls--%>              <%--All the Other Controls--%>          <%} %>      </ form >もう1つ注意しなければならないことは、GridView、RadGrid、etcのような複雑な制御を使用すると、イベントを選択、挿入、更新、削除することができます.Response.IsRequestBeingRedirectedがtrueの場合、これらのイベントの操作(挿入、更新または削除)をキャンセルする必要があります.次の例です.
1
2
3
4
5
6
7
8protected void GridView1_RowEditing( object sender, GridViewEditEventArgs e)          {              if (Response.IsRequestBeingRedirected)              {                  e.Cancel = true ;                  return ;              }          }まとめ:
この記事では、Responseの使い方を説明します.Redirect . 私もいくつかのリスク問題を発見しました.Responseを採用することができる.Redirectの最適化と技術はリスクを低減する.同じようにこの文章が好きになってほしい. 
原文住所:using-response-redirect-effectively.aspx