2013-12-12 4 views
-1

그래서 나는이 액션을 int 파라미터를 받고 그것에 종속 된 json을 반환하는 asp.net mvc 컨트롤러에 가지고있다. 해당 작업이동시에 동일한 ASP.NET 액션에 복수의 아약스 요청

Public JsonResult GetSomeData(int intParam) 
{ 
    var someData = _someService.GetSomeDataByIntParam(intParam); 
    return Json(someData); 
} 

을 보는 방법이 그래서 여기에 특별한 아무것도, 필요한 모든 작업이 SomeService의 인스턴스에 의해 수행이없는 한 다음 작업 그냥 JSON을 반환합니다. 이 부분 _someService.GetSomeDataByIntParam(intParam);의 평균 소요 시간은 35-80 밀리 초입니다. 프론트 엔드에서 Ajax가이 액션을 호출하는 Jquery 코드가 있고 대답을 얻으면 json의 데이터가 DOM의 어딘가에 저장된다. 이 (일부 razor 포함) jQuery 코드

@foreach (var intParam in Model.IntParams) 
{ 
    <script type="text/javascript"> 
     $.ajax({ 
      type: 'POST', 
      url: '/SomeController/GetSomeData', 
      data { intParam: @intParam }, 
      success : function (response) { 
       var responseParam = response.param; 
       if (response.anotherParam) 
        responseParam += '<span class="some-class">!</span>'; 

       var someForm1 = $('#[email protected]'); 
       someForm1.children('span.some-another-class').html(responseParam); 

       var someForm2 = $('#[email protected]'); 
       someForm2.children('span.some-another-class').html(responseParam); 
      } 
     }); 
    </script> 
} 

은 3-10 요소 IntParams을 int로 평균이있을 것입니다. js는 페이지가 렌더링 된 직후에 실행됩니다. 그래서 전체 시나리오는 이와 같습니다. 페이지가 그려지면 json 데이터가 쿼리되고 js로 전달되면 DOM의 어딘가에 삽입됩니다. json을 되 돌리는 액션은 하나를 실행하는 동안 다른 요청을 대기 중입니다. 그래서 그 5 개의 ajax 호출이 한 번에 하나씩 실행되는 액션으로 호출된다고 가정하십시오. (세션 상태를 끄지 않고 비동기로 만들 수 있습니까?) 첫 번째 요청은 30-80 밀리 초의 응답을 얻고 다섯 번째 요청은 2-2.2 초 안에 응답을 얻습니다. 이것은 응용 프로그램에서 매우 중요한 부분이므로 밀리 초를 잃고 싶지는 않습니다. 나는 행동이 평균 30-80 밀리 초가 걸리면 5 번째 사람이 2 초 안에 대답을 얻는 이유를 이해하지 못한다. 400 (5 * 80) 밀리 초와 같은 것이 아니어야합니까? 또는이 통화 대기열 작업이 너무 오래 걸리는 것입니까? 최적화를하기 위해 할 수있는 일. 나는 10 초 이상의 호출이 있었으면 5 초 정도 걸릴 것입니다. 어쨌든이 모든 일을 빠르게하기 위해 할 수있는 일은 어떨까요. 어떤 제안이라도 인정 될 것입니다. (js 코드에서도)

답변

1

현재보기의 모델에 문제가 있다고 생각합니다.

이것이 현재 시나리오 인 경우 제발 해결하십시오. Model.IntParams에 일종의 단일 배열이 있거나 목록 일 수 있습니다. IntParams의 각 항목에 대해 을 요청하면 서버에 요청을 보냅니다. 5 또는 10 항목 수를 계산하면 5 또는 10 요청을 보내고 개발 또는 테스트 중에는 문제가되지 않는다고 가정합니다. 프로덕션 데이터를 얻은 후에는 100 또는 1000s가 될 수 있으므로 많은 요청을 보내야합니다. IIS는 세션을 잠금으로써 각 요청을 처리 할 것이므로 동시 처리로 말할 수는 없습니다. 확인해보십시오. jQuery Ajax - Running multiple requests against ASP.NET MVC

또한보기에 필요한 모든 속성이 포함 된 강력한 모델을 사용하는 것이 좋습니다. 일단 강력한 모델을 작성하면 데이터를 채우고 보게됩니다.

데이터 표시 방법에 대한 책임은보기 전용입니까? 모델에서 플래그를 설정하여 조건을 확인하고 수행 할 작업을 결정할 수 있습니다. 그것은 또한 당신과 함께 일하는 다른 사람이 코드를 읽고 이해하기 쉽게 만듭니다. 데이터를 모델에 채우는 모델과 메커니즘을 수정하여 성능을 향상시킬 수 있다고 생각합니다.

+0

예 내 모델에는 int 콜렉션이 하나 있지만 뷰는 사실 내 모델에서 다른 것을 필요로하지 않는 부분 뷰입니다. 이 부분 뷰는 다른 뷰에 주입되고 다른 뷰는 레이아웃에 주입되어 다른 뷰에는 특정 모델이 있습니다. – Dimitri

+0

그런 다음 필요한 모든 특성을 가진 뷰에 대한 특정 뷰 모델을 만듭니다. 나는 현재의 접근 방식이 미래에 많은 문제를 분명히 열 것이라고 믿습니다. 또한 루프에서 연속적으로 아약스 요청을 보내는 것은 나쁜 습관이며 궁극적으로 애플리케이션의 성능을 가져옵니다. 데이터로 작업 할 때만 차이를 느낄 수 있습니다. – kbvishnu

+0

루프에서 아약스 호출을해야합니다. 호출 수가 어떻게 될지 모르겠습니다. 그래서 루프에서 처리 할 수있는 이유는 무엇입니까? 뷰에 필요한 모든 매개 변수가 이미 모델에 있습니다. 그 컬렉션을 제외하고는 다른 것들을 넣을 생각이 없습니다. – Dimitri