この記事は機械翻訳のミラー記事です。元の記事にジャンプするにはこちらをクリックしてください。

眺める: 29669|答える: 3

[ASP.NET] ページ上で同時に複数のリクエストが ASP.NET ると、ブロック中の休眠状態になります

[リンクをコピー]
掲載地 2017/09/22 17:32:59 | | | |
最近、プロジェクトを進めているときに、いくつかのページが大量のデータ読み込みを必要とし、時にはページが読み終わるのを待たずにページをクリックしてしまい、また別のページをクリックしてしまいました

ウェブページの読み込み中は非常にゆっくりとした休眠状態になるので、今日は慎重に調べてみよう。

最初は、多くのウェブサイトで同じような状況や自分のパソコンのネットワーク速度の問題で起こるのかと思いましたが、このサイトにはそういった問題はなく、投稿時に時々詰まることがありましたが、タブ内の他のページをクリックして素早く読み込むと困ることがありました。

今日は詳しく見てみましょう!! まずコードがテストされました:

ホームビューコード:

コントローラーコード:



テストコード解析には、コントローラーには3つのメソッドがあります。1つはホームページ、残りの2つはテストメソッドです

Test1リクエストは5秒間ブロックされ、その後ユーザーにデータが返されます

Test2リクエストはブロックされず、データを直接ユーザーに返します

私たちのホームページはAjaxリクエスト用の2つのインターフェースで構成されており、非同期リクエストなのでブロッキングの問題はありません。

Test1メソッドはTest2がコンテンツを出力した後にのみ出力することがわかります(通常、ページはTest2から返された内容を直接出力し、その後5秒待ってTest1から返すコンテンツを出力します。jsはブロックしないためです



次に、Test1とTest2のインターフェースに直接アクセスします。まずTest1にアクセスし、次にすぐにTest2にアクセスすると、Test2はTest1が戻るまで待たなければなりません。以下の図のように。



ページリクエストがリーダーロックを設定した場合、同じセッション内で同時に処理されている他のリクエストはセッション状態を更新できませんが、少なくとも読み取ることは可能です。 ページがセッション状態の書き込みロックを要求した場合、他のすべてのページはブロックされます。読み書きを望んでいなくてもです。 例えば、同じセッションで2つのプログラムビューが同時にコンテンツを書き込んでいる場合、一方のプログラムはもう一方のプログラムが完成するまで書く必要があります。 AJAXプログラミングでは、この現象に注意しておくことが重要です。

特別な注意:セッションを書くときだけ Asp.net リクエストをブロックしますが、セッションが書かれたページ(例えばセッションでシステムにログインした後の操作)を訪問している限り(セッションは期限切れまでロックされます。もちろん、SessionIDが同じの場合に限ります)。 この問題は必ず起こるでしょう。

ネットユーザー情報

ウェブサイトがセッションを使用している限り、各リクエストはその期間中セッションをロックするため、同じセッションIDのリクエストはアンロックされるまで待たなければなりません

つまり、ウェブサイトにタイムアウトページがある場合、何もできず、タイムリーディングページが読み込まれるのを待たなければなりません。

同じページに複数のAjax同時リクエストがある場合もできません。ポーリングリクエストをメッセージで送ることはできません。



まとめると:リクエストにセッションを取っても、リクエストにセッションを持たなければ、上記の状況は起こりません

解決:

コントローラーコントローラにSessionState(System.Web.SessionState.SessionStateBehavior.ReadOnly)機能を追加しました

手記:

必要とは、セッションに対して排他的ロックを要求していることを意味します(つまり、同じセッションIDに対してリクエストを並列処理しないことです)。
ReadOnlyとは、セッションに対して非排他的ロックを要求していることを意味します(つまり、排他的ロックのリクエストが完了するまでリクエストは待たなければなりませんが、非排他的ロックでリクエストを処理できます 鍵は並列で。 ただし、コードがSessionに書き込まれないようにするのはあなた次第です。 必ずしもフレームワークによって強制されているわけではありません)
必要とは、あなたが要求したセッションミューテックス(つまり、同じSessionIDを並列処理する必要がない)を意味します。

ReadOnlyとは、リクエストしたセッションが非排他的ロックであることを意味します(つまり、リクエストは完了を待つ必要がありますが、排他的ロックのリクエストは並列で非排他的ロックで処理可能です)。 ただし、コードがセッションを書かないように注意したいです。 必ずしもフレームワークで実行する必要はありません。





先の:CEF:クライアント用にChromeを埋め込む
次に:HTTPエラー503。 サービスは利用できません。
掲載地 2018/07/06 11:53:31 |
WebFormsについては、aspxの上部のページの後に追加してください(そのブロッキングページを読み込むだけです):

EnableSessionState="ReadOnly"
 地主| 掲載地 2019/07/14 20:34:17 |
ほとんどのウェブ開発はセッション状態を保存するためにセッションを使用しますが、asp.net アプリケーションでセッションを使用することはウェブアプリケーションのパフォーマンスに大きな影響を与える可能性があります。 なぜ、そして何が影響するかを以下に分析します

MSDNによる並行リクエストおよびセッションの説明:

同時要求とセッション状況
ASP.NET セッション状態へのアクセスはセッションごとに行われ、つまり2人の異なるユーザーが同時にリクエストを送信した場合、各セッションへのアクセスが同時に付与されます。 しかし、2つの同時要求が同じセッション(同じSessionID値を使って)であれば、最初のリクエストがセッション情報への排他的アクセス権を得ます。 2回目のリクエストは、最初のリクエストが完了した後にのみ実行されます。 (最初のリクエストがロックのタイムアウトを超えてセッション情報の排他的ロックが解放された場合、2回目のセッションもアクセス権を得ます。) @Pageの指示でEnableSessionStateの値をReadOnlyに設定すると、読み取り専用セッション情報の要求はセッションデータに対して排他ロックされません。 しかし、セッションデータへの読み取り専用リクエストは、セッションデータによって設定された読み書き要求からロックが解除されるまで待つ必要がある場合があります。
免責事項:
Code Farmer Networkが発行するすべてのソフトウェア、プログラミング資料、記事は学習および研究目的のみを目的としています。 上記の内容は商業的または違法な目的で使用されてはならず、そうでなければ利用者はすべての結果を負うことになります。 このサイトの情報はインターネットからのものであり、著作権紛争はこのサイトとは関係ありません。 ダウンロード後24時間以内に上記の内容を完全にパソコンから削除してください。 もしこのプログラムを気に入ったら、正規のソフトウェアを支持し、登録を購入し、より良い本物のサービスを受けてください。 もし侵害があれば、メールでご連絡ください。

Mail To:help@itsvse.com