この記事では、ASP.NET ページ間のデータ転送のいくつかの方法について説明します。これが、ASP.NET ページ間のデータ転送の有用性と利便性を正しく理解するのに役立つことを願っています。
0. はじめに
Web ページはステートレスであるため、サーバーは各リクエストが異なるユーザーからのものであるとみなします。そのため、同じページに対する複数の連続したリクエストの間、またはページがジャンプしたとき、変数の状態は保持されません。 ASP.NET を使用して Web システムを設計および開発するときに直面する重要な問題は、データがページ間で正しく、安全かつ効率的に送信されることを保証する方法です。Asp.net は、保存の問題を解決するための状態管理などのさまざまなテクノロジを提供します。データの問題については、.NET でこの問題を解決するためのさまざまな方法と、それぞれの適用可能な状況を調べてみましょう。
1. ASP.NET ページ間のデータ転送のさまざまな方法と分析
1.1 Querystring メソッドの使用
QueryStringはクエリ文字列とも呼ばれ、Webページのアドレス(URL)の末尾に転送するデータを付加して転送します。たとえば、ページ A.aspx からページ B.aspx にジャンプするには、Request.Redirect("B.aspx? パラメーター名 = パラメーター値") メソッドを使用するか、ページがジャンプした後にハイパーリンク: を使用できます。 、Ruquest["パラメータ名"] でパラメータを受け取ることができます。 QuerySting メソッドを使用する利点は、実装が簡単でサーバー リソースを使用しないことです。欠点は、渡された値がブラウザのアドレス バーに表示されるため、改ざんされる危険性があり、オブジェクトを変更できないことです。クエリ文字列は、URL を介してページをリクエストできる場合にのみ使用できます。
1.2 隠しフィールドの利用
通常、非表示フィールドはユーザーのブラウザに表示されません。サーバーと対話するときに、値が非表示コントロールに割り当てられ、次のページに送信されます。非表示ドメインは、Web ページに保存されている、Web ページに関連するあらゆる情報のリポジトリになる可能性があります。隠しフィールドを使用して値を格納する場合は、hidden control.value=数値を使用します。受信した値を取り出す場合は、variable=hidden control.value を使用します。隠しフィールドを使用する利点は、実装が簡単であることです。隠しフィールドは標準の HTML コントロールであり、複雑なプログラミング ロジックを必要としないことです。非表示フィールドはページ上で保存および読み取りされ、サーバー リソースを必要とせず、ほぼすべてのブラウザーとクライアント デバイスが非表示フィールドを含むフォームをサポートしています。欠点は、ストレージ構造がほとんどなく、単純なデータ構造のみをサポートすることです。ページ自体に保存されるためストレージ容量が小さいため、より大きな値を保存できず、大量のデータはファイアウォールやプロキシによってブロックされます。
1.3 ビューステート
ViewState は、ASP.NET ページ フレームワークによって管理される非表示のフォーム フィールドです。 ASP.NET がページを実行すると、ViewState 値とページ上のすべてのコントロールが収集され、エンコードされた文字列にフォーマットされて、非表示のフォーム フィールドの Value プロパティに割り当てられます。 ViewState を使用してデータを転送する場合は、ViewState ["変数名"]=数値を使用します。 データを取得する場合は、variable=ViewState["変数名"] を使用します。 ViewState を使用する利点は、同じページに対する複数のリクエスト間で値が自動的に保持されること、サーバー側のリソースが必要ないこと、実装が簡単であることです。ビュー ステートの値はハッシュ化および圧縮されており、 Unicode 実装用にエンコードされており、隠しフィールドを使用するよりも高いセキュリティが必要です。欠点は、ViewState がページ自体に格納されるため、より大きな値を格納すると、ページの表示や送信時にユーザーの速度が低下する可能性があることです。 。ビューステートはデータをハッシュ形式で保存しますが、それでも改ざんされる可能性があります。
1.4 クッキーの使用
Cookie はページ間で少量の情報を転送し、クライアント上のテキスト ファイルまたはクライアントのメモリに保存できます。 Cookie 方式は、ログインしている Web サイトのログイン ユーザー名の保存、ユーザー入力の利便性の提供、一部のユーザー定義項目に対するユーザーの個人設定の保存など、少量のページで頻繁に変更される情報を保存するのに適しています。 Cookie を使用してデータを転送する場合に使用できます: Response.Cookies["キー名"]=キー値; データを取得する場合: 変数名=Request.Cookies["キー名"]。 Cookie を使用する利点は次のとおりです。Cookie はクライアントに保存され、サーバー リソースを使用せず、実装が簡単で、有効期限を構成できます。欠点: 保存できるデータの量は比較的少ないです。Cookie はすべてのブラウザでサポートされているわけではなく、ユーザーによって禁止または削除される可能性があるため、重要なデータの保存には使用できません。さらに、Cookie は単純なプレーン テキストで保存されるため、暗号化されていない機密データを保存することは適切ではありません。
1.5 アプリケーション変数の使用
アプリケーション変数はページ間で値を転送するためにも使用できます。アプリケーション変数はグローバルであり、一度定義すると、プログラムのすべての部分に影響します。アプリケーション全体で特定の変数値を使用する場合は、Application オブジェクトが最適な選択です。データを保存する場合は、アプリケーション変数に値を追加します: Application["変数名"]=数値; データを取得する場合に使用します: variable=Application["変数名"]; アプリケーションを使用する必要がない場合は、値をクリアします。明示的に:Application["数量名"]=null。
アプリケーションの利点: 使いやすく、グローバルな範囲。アプリケーション内のすべてのページで利用できます。短所: データを保存するサーバー側のプロセスが破損した場合 (サーバーのクラッシュ、アップグレード、シャットダウンなどにより)、データが失われるため、アプリケーションを使用する際にはサーバー側のメモリを占有する確実な戦略が必要です。 、サーバーのパフォーマンスとアプリケーションのスケーラビリティに影響を与える可能性があります。
1.6 セッション変数の使用
Session オブジェクトを使用して、維持する必要がある指定された会話に関する情報を保存できます。異なるクライアントは異なる Session オブジェクトを生成します。セッションは、個々のセッションに固有の短期情報を保存するために使用されます。 Session の使い方や形式は Application と同じです。
利点: 実装が簡単で、高いセキュリティと耐久性を提供し、IIS の再起動と補助プロセスの再起動に対応でき、複数のプロセスで使用できます。欠点は、サーバー側のメモリを消費することです。したがって、多くの情報を保存しないでください。セッションの最も一般的な用途は、Cookie とともに Web アプリケーションにユーザー識別機能を提供することです。セッションは、Cookie をサポートしていないブラウザでも使用できます。ただし、Cookie のないセッションを使用するには、クエリ文字列にセッション識別子を配置する必要があり、この記事のクエリ文字列セクションで説明したセキュリティの問題も発生します。
1.7 クラスの静的プロパティの使用
このメソッドは、クラスの静的プロパティを使用して、2 つのページ間で値を転送します。静的属性を含むクラスを定義し、転送する値を静的属性に割り当てます。ターゲット ページは、静的属性を介してソース ページで転送する値を取得できます。
利点は複数のデータを簡単に送信できることですが、欠点は追加のプログラミングが必要であり、プログラミングの負荷が増加し、サーバーのメモリを占有することです。
1.8 Server.Transfer の使用
Server.Transfer メソッドを使用して、現在の ASPX ファイルから同じサーバー上の別の ASPX ページに実行フローを転送する際、フォーム データまたはクエリ文字列を保持できます。この方法では、メソッドの 2 番目のパラメータを True に設定します。最初のページは Server.Transfer("target page name.aspx", true) を使用し、ターゲット ページはデータの取得に Ruquest.Form["Control Name"] または Ruquest.QueryString["Control Name"] を使用します。このようにAsp.net2.0でも使用できます。コードは次のとおりです。
前のページ ページ 1;
pg1=(前のページ)Context.Handler;
Response.Write(pg1.Name);
説明: このコードは、ターゲット ページから渡された値を取得するために使用されます。Previous-Page は元のページのクラス名であり、Name は元のページで定義された属性であり、転送する必要があるデータはこの中に格納されます。属性。
このメソッドを使用すると、別のページから値にアクセスできるように、いくつかのプロパティを作成する必要があります。このメソッドは、ページ間で値を渡す場合に特に便利です。この方法は単純であるだけでなく、オブジェクト指向でもあります。
1.9 キャッシュ
キャッシュには強力なデータ操作機能があり、キーと値のペアのコレクションの形式でデータを保存し、キーワードを指定してデータ項目を挿入および取得できます。依存関係に基づいた終了機能により、キャッシュ内のデータがタイムリーに更新および削除される方法を正確に制御できます。ロック管理を内部で実行でき、Application オブジェクトのようにシリアル化管理に Lock() メソッドと Unlock() メソッドを使用する必要はありません。欠点は、使用方法が複雑で、不適切な使用によりパフォーマンスが低下することです。
2. さまざまなページジャンプ状況で使用できる値の転送方法
2.1 シナリオ 1: ソース ページはターゲット ページにジャンプでき、ソース ページはデータをターゲット ページに渡します。
クエリ文字列の使用は、あるページから別のページに少量の情報を転送するためのシンプルで一般的な方法であり、セキュリティ上の問題はありません。Server.Transfer メソッドを使用して、フォーム データまたはクエリ文字列を別のページに渡すこともできます。最初のページの HttpContext このメソッドは、ターゲット ページとソース ページが同じサーバー上にある場合に使用できます。
2.2 ケース 2: ページが値を自身のページに渡す
つまり、同じページに対する複数のリクエストにわたって値を保持することにより、ViewState プロパティは基本的なセキュリティを備えた機能を提供します。非表示フィールドは、それ自体または別のページにポストバックされる少量のページ情報を保存するために使用することもでき、セキュリティ問題が考慮されない場合に使用されます。
2.3 ケース 3: ソース ページはターゲット ページに値を渡しますが、ソース ページをターゲット ページに直接接続することはできません。
複数の方法があり、どれを使用するかは特定の状況によって異なります。
アプリケーション: セキュリティが問題にならない場合、複数のユーザーによって使用され、頻繁には変更されないグローバル情報を保管します。大量の情報を保存しないでください。セッション: 個々のセッションに固有であり、高度なセキュリティが必要な短期情報を保存します。セッション状態に大量の情報を保存しないでください。セッション状態オブジェクトは、アプリケーション内の各セッションの存続期間中作成され、維持されることに注意してください。多くのユーザーをサポートするアプリケーションでは、これによりサーバー リソースが大量に消費され、スケーラビリティに影響を与える可能性があります。
Cookie: クライアント側で少量の情報を保存する必要があり、セキュリティ上の問題がない場合に使用されます。クラスの静的属性により、複数のデータの送信が容易になります。
キャッシュ: 単一ユーザー、ユーザーのグループ、またはすべてのユーザーのオブジェクト。複数のリクエストのデータを長期間効率的に保存できます。上記のメソッドは 3 番目のケースだけでなく、前の 2 つのケースでも使用されます。不要な場合はできるだけ使用しないようにしてください。そうしないと、リソースの無駄が発生したり、プログラムが複雑になったりします。