1

私はかなり単純なコントローラーを持っています:

  public class HomeController : Controller
    {
        public ActionResult Index()
        {
            Session["SomeData"] = "123";
            return View();
        }

        [HttpPost]
        public ActionResult LongTest()
        {
            Thread.Sleep(5000);
            return Json(new { Text = DateTime.Now.ToString("hh:mm:ss.fff") + " - LongTest"});
        }

        [HttpPost]
        public ActionResult CantAnswer()
        {
            return Json(new { Text = DateTime.Now.ToString("hh:mm:ss.fff") + " - CantAnswer"});
        }
    }

これらのメソッドをクライアント側から次のように使用します。

<script type="text/javascript">
    $(document).ready(function () {
        $('#btnLongOperation').click(function () {
            $.post("/Home/LongTest", null, function (data) {
                $('#result').text(data.Text);
            }, "json");
        });

        $('#btnWnotWork').click(function () {
            $.post("/Home/CantAnswer", null, function (data) {
                $('#result').text(data.Text);
            }, "json");
        });
    });
</script>
<div>
    <input id="btnLongOperation" type="button" value="Long operation"/>
    <input id="btnWnotWork" type="button" value="Won't work"/>
</div>
<div id="result">

最初のボタンをクリックしてから 5 秒待たずに 2 番目のボタンをクリックすると、2 番目のアクションは呼び出されません。Init メソッドで session を使用して文字列を削除すると、アクションを互いに待たずに呼び出すことができることがわかります。ただし、セッション オブジェクトを使用すると、最初のアクションが終了するまで、2 番目のアクションの結果は表示されません。asp.net mvcのこの動作を説明できる人はいますか?

4

2 に答える 2

2

これは、セッションのロックが原因です。基本的に、セッション状態を使用する各リクエストは、読み取りが完了するまでロックを設定します。後続のリクエストは、前のリクエストがロックを解放するまでアクセスできません。Session

これの目的は、セッション データの整合性を確保することです。たとえば、リクエスト A がセッションに書き込む必要があり、リクエスト B が読み取る必要があるが、リクエストが同時に発行された場合はどうなるでしょうか。B が読み取るデータは、書き込み前か書き込み後かを知る方法がないため、予測できません。

詳細については、ここを参照してください。

http://www.timvasil.com/blog14/post/2008/04/16/Handling-multiple-simultaneous-requests-from-a-user-in-ASPNET.aspx

于 2013-04-25T11:40:23.983 に答える