Отключение сеанса в MVC3 для разрешения нескольких вызовов AJAX - PullRequest
0 голосов
/ 11 февраля 2012

При выполнении нескольких одновременных вызовов Ajax блокируется мое веб-приложение MVC.Я читал и нашел две темы с одной и той же проблемой

Почему несколько одновременных вызовов AJAX для одного и того же действия ASP.NET MVC приводят к блокировке браузера?

Асинхронный контроллер блокирует запросы в ASP.NET MVC через jQuery

Решением для них является отключение сеанса с использованием ControllerSessionStateAttribute . Я пробовал использовать атрибут, но мойкод все еще блокируетВы можете воспроизвести проблему, создав новое веб-приложение MVC3 со следующим кодом

@{
    ViewBag.Title = "Home Page";
}

<h2>@ViewBag.Message</h2>
<p>
    Example of error when calling multiple AJAX, try click quickly on both buttons until the server get blocked.
</p>
<button onclick="cuelga++;SetCallWaiting(cuelga);">Set a call waiting in the server</button><button onclick="libera++;ReleaseEveryone(libera);">Release all calls in the server</button>
<div id="text"></div>
<script type="text/javascript">
    var cuelga = 0;
    var libera =0;

        function ReleaseEveryone(number) {
            var url =  "/Home/ReleaseEveryone/";
            $.post(url, { "id": number },
                ShowResult1, "json");

        };

        function SetCallWaiting(number) {

            var url = "/Home/SetACallWaiting/";
            $.post(url, { "id": number },
                ShowResult, "json");
        };

        function ShowResult (data) {
            $("#text").append(' [The call waiting number ' + data[0] + ' come back ] ');
            /* When we come back we also add a new extra call waiting with number 1000 to   make it diferent */
            SetCallWaiting(1000);
        };
        function ShowResult1(data) {
            $("#text").append(' [The release call number ' + data[0] + ' come back ] ');
        };
</script>

, и это HomeController

using System;
using System.Collections.Generic;
using System.Web.Mvc;
using System.Threading;
using System.Web.SessionState;

namespace ErrorExample.Controllers
{
    [SessionState(SessionStateBehavior.Disabled)]
    public class HomeController : Controller
    {
        private static List<EventWaitHandle> m_pool = new List<EventWaitHandle>();
        private static object myLock = new object();


        public ActionResult Index()
        {
            ViewBag.Message = "Welcome to ASP.NET MVC!";

            return View();
        }

        public ActionResult About()
        {
            return View();
        }

        [HttpPost]
        public JsonResult SetACallWaiting()
        {
            EventWaitHandle myeve;
            lock (myLock)
            {
                myeve = new EventWaitHandle(false, EventResetMode.ManualReset);
                m_pool.Add(myeve);
            }
            myeve.WaitOne();

            var topic = HttpContext.Request.Form[0];
            return Json(new object[] { topic });
        }

        [HttpPost]
        public JsonResult ReleaseEveryone()
        {
            try
            {
                lock (myLock)
                {
                    foreach (var eventWaitHandle in m_pool)
                    {
                        eventWaitHandle.Set();
                    }
                    m_pool.Clear();
                }
                var topic = HttpContext.Request.Form[0];
                return Json(new object[] { topic });
            }
            catch ( Exception )
            {
                return Json( new object[] { "Error" } );
            }
        }
    }
}

Заранее большое спасибо.

1 Ответ

0 голосов
/ 16 мая 2012

Я не думаю, что эта проблема вообще-то связана с SessionState.Каждый браузер делает только ограниченное количество одновременных запросов к домену - подробности см. в этой статье .

Я думаю, что проблема вызвана тем фактом, что если вы запустите несколько запросов «SetACallWaiting», вы столкнетесь с ситуацией, когда браузер даже не отправит запрос на сервер, пока предыдущие запросы не будут оставлены без ответа -поэтому запрос "ReleaseEveryone" не отправляется браузером.Следовательно, вы получаете поведение блокировки.

Также может быть проблема с размещенным вами примером кода - «SetCallWaiting (1000);»строка в функции ShowResult.С этим вызовом вы фактически не уменьшите количество ожидающих запросов, так как каждый раз, когда запрос освобождается, он будет заново создаваться (я не уверен, что вы этого хотели или нет).

Чтобы проверить это поведение, посмотрите на запросы, отправляемые браузером, и установите точки останова в действиях контроллера, и посмотрите, как он ведет себя для различных типов запросов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...