2012-02-11 4 views
0

동시에 여러 Ajax 호출을 수행하면 MVC 웹 응용 프로그램이 차단됩니다. 내가 읽고있는 나는 같은 문제MVC3에서 여러 AJAX 호출을 허용하는 세션 해제

Why would multiple simultaneous AJAX calls to the same ASP.NET MVC action cause the browser to block?

Asynchronous Controller is blocking requests in ASP.NET MVC through jQuery

두 개의 주제를 발견

그들을 ControllerSessionStateAttribute .I이 속성을 사용하여 시도가 사용하여 세션을 사용하지 않고, 내 코드가에 대한 솔루션 여전히 차단.

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" }); 
      } 
     } 
    } 
} 

가 사전에 대단히 감사는 다음 코드

@{ 
    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> 

로 새로운 MVC3 웹 응용 프로그램을 만드는 문제를 재현 할 수 있으며 이는 HomeController

입니다.

답변

0

이 문제는 실제로 SessionState와 관련이 없다고 생각합니다. 모든 브라우저는 한 도메인에 대해 제한된 수의 동시 요청 만 수행합니다. 자세한 내용은 this article을 참조하십시오.

여러 개의 "SetACallWaiting"요청을 시작하면 이전 요청에 답이 없을 때까지 브라우저가 서버에 요청을 보내지 않는 상황이 발생한다는 사실 때문에 문제가 발생한다고 생각합니다. "ReleaseEveryone"요청은 브라우저에서 보내지 않습니다. 따라서 잠금 동작이 발생합니다.

게시 한 코드 샘플에 문제가있을 수도 있습니다. "SetCallWaiting (1000);" ShowResult 함수의 행. 이 호출을 사용하면 요청 대기 시간이 줄어들지 않으므로 다시 요청할 수 있습니다.

이 동작을 테스트하려면 브라우저에서 전송 된 요청을보고 컨트롤러의 동작에서 중단 점을 설정하고 다양한 요청에 대해 어떻게 동작하는지 확인하십시오.

관련 문제