ホーム > ASP.NET, Visual Basic > そういえば、Session変数を利用すると、リクエストが直列化されるのね。

そういえば、Session変数を利用すると、リクエストが直列化されるのね。


そういえば、昔@ITの掲示板で話題になったような記憶がある。。。すっかり忘れていました。

クライアントより複数の要求が来た場合の動作について

via なちゃさん

同一セッションになる要求は、同一スレッドで直列に処理されるようになっています。
同一セッションの処理が別スレッドで実行されないようにするためというのと、
セッション情報を外出しした場合にセッションへの書き込みを矛盾なく実行するため、
辺りが理由だったと思います。

[asp][.net] 同一セッションの振る舞い

ASP.NETは同一セッションかどうかを判断して、リクエストを直列化するようです。つまり、同一セッションで複数同時にリクエストを投げると、最初のリクエストの処理が終わるまで待たされるという具合です。

これは、セッション管理はInProcとStateServerがありますが、どちらを使っても矛盾しないように設計されているためだと思います。

WebFormのアプリにWinFormから時間のかかる処理を、非同期で投げてもシリアライズされちゃしょうがないね。サンプルまで作って検証してしまった。。。

こんなジェネリックハンドラーがあったとして、

    Sub ProcessRequest(ByVal context As HttpContext) Implements IHttpHandler.ProcessRequest
        Dim starttime = DateTime.Now.ToString("HH:mm:ss.fff")
        context.Session("アクセス時間") = starttime

        Dim key = context.Request("key")
        Dim message = context.Request("message")

        ' 時間のかかる処理
        System.Threading.Thread.Sleep(key * 1000)

        Dim endtime = DateTime.Now.ToString("HH:mm:ss.fff")

        context.Response.Write(String.Format("その{1}  Hello World!{0}秒後<br />", key, message))
        context.Response.Write(String.Format("{0}~{1}の間実行<br />", starttime, endtime))
        context.Response.Write(String.Format("セッションの中身[{0}]", context.Session("アクセス時間")))

        context.Session("アクセス時間") = endtime
    End Sub

こんな風にiframeで非同期に取得させると、サーバー側の処理がシリアライズされます。

    <iframe src="Handler1.ashx?key=2&message=1"></iframe>
    <iframe src="Handler1.ashx?key=2&message=2"></iframe>
    <iframe src="Handler1.ashx?key=2&message=3"></iframe>
    <iframe src="Handler1.ashx?key=2&message=4"></iframe>
    <iframe src="Handler1.ashx?key=10&message=5"></iframe>
    <iframe src="Handler1.ashx?key=5&message=6"></iframe>
    <iframe src="Handler1.ashx?key=3&message=7"></iframe>

開発者ツールでキャプチャしてみると、リクエストは非同期に投げているのに、サーバーでの処理が一個づつ処理されているのがわかります。

image

セッションにアクセスしている部分を削除すると(同一セッションで一度もセッションを利用しなければ)、IEのセッション数の上限に引っかかりますが、非同期に処理されるのが確認できます。

image

どうしようかなー。

広告
カテゴリー:ASP.NET, Visual Basic タグ:
  1. まだコメントはありません。
  1. No trackbacks yet.

コメントを残す

以下に詳細を記入するか、アイコンをクリックしてログインしてください。

WordPress.com ロゴ

WordPress.com アカウントを使ってコメントしています。 ログアウト / 変更 )

Twitter 画像

Twitter アカウントを使ってコメントしています。 ログアウト / 変更 )

Facebook の写真

Facebook アカウントを使ってコメントしています。 ログアウト / 変更 )

Google+ フォト

Google+ アカウントを使ってコメントしています。 ログアウト / 変更 )

%s と連携中

%d人のブロガーが「いいね」をつけました。