Получить большой 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>