Получить большой JSON из веб-API

Я использую.net Web Api для получения данных для моей сетки данных. Звонок осуществляется через AJAX, как это

 $.ajax({
   type: 'GET',
   dataType: 'json',
   contentType: "application/json; charset=utf-8",
   url: ReportURL, // "api/AppData/InvoiceReport/10"
   success: function (mydata) {
     
     console.log(mydata);
     createReportGrid(myData); // this function creates a KENDO grid
   },                
   error: function (error) {
     alert(error);
   }
 });

Метод Web API выглядит следующим образом

[HttpGet]
public HttpResponseMessage InvoiceReport(int Id)
{
  // some llogic of data retrieving
  // objReportDataList is of Type List<vmReport>
  // thisstructure contains a DataTable, and 2 more list type  
 return Request.CreateResponse(HttpStatusCode.OK, objReportDataList);
}

Эти вызовы прекрасно работают для строк приблизительно 100 000 строк

Web Api отлично сериализуется. Но когда количество строк превышает 200K, я получаю внутреннюю ошибку сервера 500. Трассировка стека сообщает "System-OutOfMemoryException-occured-in-mscorlib-dll"

ПРИМЕЧАНИЕ. - Я не могу использовать нумерацию серверов, чтобы получать только небольшие данные. Эти миллионы строк данных работают в приложении ASP.NET Webforms. Мы перешли на шаблон MVC и использовали WebApi для выборки данных, но эта ошибка возникает. PS - я пробовал много много решений, но беспомощных

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

2 ответа

Вы должны передать ответ. тогда вы можете вернуть миллионы строк, которые отправляются кусками.

[HttpGet]
public HttpResponseMessage PushStreamContent()
{
    var response = Request.CreateResponse();

    response.Content = 
        new PushStreamContent((stream, content, context) =>
    {
        foreach (var staffMember in _staffMembers)
        {
            var serializer = new JsonSerializer();
            using (var writer = new StreamWriter(stream))
            {
                serializer.Serialize(writer, staffMember);
                stream.Flush();
            }
        }
    });

    return response;
}

больше информации здесь: http://dblv.github.io/2014/07/02/streaming-web-api/

Вы можете добавить ниже в файле web.config

<configuration> 
   <system.web.extensions>
       <scripting>
           <webServices>
               <jsonSerialization maxJsonLength="50000000"/>
           </webServices>
       </scripting>
   </system.web.extensions>
</configuration>
Другие вопросы по тегам