asp.net MVC и $.ajax добавили дополнительную нагрузку на производительность

Я наткнулся на очень любопытную проблему низкой производительности, когда управление asp.net MVC вызывается функцией jquery $.ajax. Элемент управления выполняет действие с базой данных, которое занимает 403 мс, но общий вызов $.ajax составляет 3400 мс, согласно Firebug, что довольно много дополнительных накладных расходов. Мне нужно оптимизировать производительность, но я не понимаю, откуда берутся эти накладные расходы.

Вот код. В моем контроллере у меня есть

 public JsonResult SetSearchResults(Criteria searchCriteria)
 {

       SearchResult myReportsResult = _repository.GetResults(searchCriteria);    

       //the statement above takes 403 ms

       return Json(myReportsResult);
  }





 public  SearchResult GetResults(SearchCriteria searchCriteria)
  {
        SearchResult result = SearchResult();

         DataTable dbResults = _da.GetDBResults(searchCriteria);       


        List<IncidentReportHeader> irs = new List<IncidentReportHeader>();            

        for (int i = 0; i < dbResults.Rows.Count; i++)
        {
            IncidentReportHeader ir = new IncidentReportHeader();

            //populate all the properties of the ir object here,                

            irs.Add(ir);
        }

        result.Reports = irs;       
        return result;        
}

    //models
    public class SearchResult
    {

        private List<IncidentReportHeader> _res;
        private int _numOfPages=0;
        private int _recordsPerPage=0;

        public List<IncidentReportHeader> Reports {
            get { return _res; }
            set
            {
                _res = value;              
            }        
        }           


        public SearchResult()
        {
            _res = new List<IncidentReportHeader>();
        }
    }
}




//db call
   public DataTable GetDBResults(SearchCriteria searchCriteria)
       {
         //add all params to the db object needed for the stored procedure here



            DataTable dt = _db.ExecuteStoredProc("myDB.PACKAGE_NAME.stored_proc", 2000, ref  _spParams, ref _spResultVariables);
           return dt;

}

в моем JS

function SearchIncidentReports() {

    //pack the  searchCriteria object here
    var searchCriteria =...

    var start = new Date().getTime();

    $.ajax({
        contentType: 'application/json, charset=utf-8',
        type: "POST",
        url: myController/SetSearchResults,
        data: JSON.stringify({ searchCriteria: searchCriteria }),
        cache: false,
        dataType: "json",

        success: function (response) {

            var got_data = new Date().getTime();
            var diff1 = got_data - start;
            alert("data loaded in: " + diff1 + " ms");

             // do whatever you need with the data here.  
             // diff1 = 3400ms which is what Firebug shows too

        },

        error: function (xhr, ajaxOptions, thrownError) {
            var result = $.parseJSON(xhr.responseText);
            alert(result.ErrorMessage);
        }

    });
    return false;
}

Еще одно замечание: когда вызов базы данных удаляется и я заполняю объект вручную, производительность становится очень высокой.

Кажется, что переход с 403 мс на 3400 мс совершенно неверен и явно имеет неоправданные накладные расходы. Не могли бы вы указать, что здесь делается неправильно? Это довольно голые кости, и я не могу избежать обращения к базе данных.

Я попытался заставить Control вернуть пустой набор (ActionResult ), а не JsonResult, но у него была та же проблема.

Это проблема asp.net MVC?

Обновление

У меня также есть действие, которое возвращает файл Excel и точно такую ​​же операцию с базой данных внутри него. Файл возвращается через 410 мс и не использует функцию $.ajax. Похоже, $.ajaxкаким-то образом вызывает задержку. Все, что мне нужно, это получить данные из базы данных, и обычно это очень быстро.

Я добавил внутреннюю часть кода контроллера, потому что кто-то просил об этом, но я повторю, что внутренняя часть (да, общая внутренняя часть вызова контроллера )занимает 403 мс. Ясно, что проблема не в вызове сервера или базы данных. Мне кажется, что между клиентом и сервером.

Примечания:

  1. В Firebug общее время, необходимое для POST с использованием Action GetResults, составляет 3,54 с.
  2. Когда я перехожу к Net -> All в Firebug, где указана разбивка запроса, я вижу, что наибольшее время тратится на ожидание (3,5 с ).

Получается, что при общении между сервером и клиентом тратится 3,5 с -403 мс, но где и почему?

6
задан halfer 24 November 2019 в 15:18
поделиться