ASP.Net Core 2.0 API Response зависает с большой полезной нагрузкой json - PullRequest
0 голосов
/ 05 июня 2018

Я работаю над веб-API ASP Net Core 2.0.Одна из моих конечных точек возвращает объект json, который содержит текстовое поле, которое может быть довольно большим.Когда это поле становится размером около 10 МБ, контроллер просто останавливается до истечения времени ожидания.Когда я выполняю отладку, я вижу, что объект json создается в моей бизнес-логике и передается контроллеру конечной точки, но контроллер просто останавливается сразу после получения объекта json без ошибок и не возвращается к вызывающей стороне, пока не истечет время ожидания запроса,Я увеличил свой requestTimeout до 20 минут, хотя бизнес-логика генерирует объект json менее чем за 2 минуты.Он просто зависает, пока не истечет 20-минутный тайм-аут.

Вот мое действие контроллера;

[ПРИМЕР 1]

    [HttpGet(Name = "GetFile")]
    public async Task<FileResponseDto> GetFile([FromRoute] int companyId, [FromRoute] int siteId, [FromRoute] int FileId, 
        [FromHeader(Name = "Accept")] string mediaType, CancellationToken cancellationToken)
    {
        var fileResponseDto = _fileBll.GetFile(companyId, siteId, fileId, HttpContext);

        // This is the point where the controller appears to hang

        return await Task.Factory.StartNew(() => fileResponseDto, cancellationToken);

    }

и мой объект DTO;

public class FileResponseDto
{
    public string ReferenceId { get; set; }
    public string Filename { get; set; }
    public string ProcessingFile { get; set; }
}

Свойство, которое являетсябольшая строка - это свойство ProcessingFile в классе FileResponseDto.

Это работает нормально, пока мое свойство ProcessingFile не достигает примерно 30K строк (около 10 МБ), а затем контроллер просто зависает после завершения строки;

var fileResponseDto = _fileBll.GetFile(companyId, siteId, fileId, HttpContext);

В этот момент я предположил, что я столкнулся с некоторым ограничением размера объекта json.Итак, чтобы проверить, я изменил свой контроллер, чтобы он вместо этого возвращал файл, как показано ниже:

[ПРИМЕР 2]

    [HttpGet(Name = "GetFile")]
    public async Task<FileContentResults> GetFile([FromRoute] int companyId, [FromRoute] int siteId, [FromRoute] int fileId, 
        [FromHeader(Name = "Accept")] string mediaType, CancellationToken cancellationToken)
    {
        var fileResponseDto = _fileBll.GetFile(companyId, siteId, fileId, HttpContext);

        var outputFile = Encoding.ASCII.GetBytes(fileResponseDto.ProcessingFile);

        return await Task.Factory.StartNew(() =>
            new FileContentResult(outputFile, new MediaTypeHeaderValue(MediaTypeNames.Application.Octet))
            {
                FileDownloadName = fileResponseDto.Filename
            }, cancellationToken);

    }

Внесение этого изменения работает, и я могу получитьвсплывающее диалоговое окно загрузки файла и успешный файл, если я выберу «Отправить и загрузить» в Postman.

Итак, это заставляет меня поверить, что в первом примере передается объект размером с json.

Тем не менее, веб-поиск не нашел ничего полезного в этом вопросе, что наводит меня на мысль, что, возможно, я что-то здесь упускаю.

Я нашел эту ссылку в StackOverflow и попытался с помощью ...

var outfileJson = JsonConvert.SerializeObject<fileResponseDto>;

outfileJson.MaxJsonLength = Int32.MaxValue;

, но у outfileJson не было свойства MasJsonLength.

Итак ..какие-нибудь идеи?

РЕДАКТИРОВАТЬ 6/8/18

Через 2 дня 22 просмотра и никаких реальных ответов.Я подумал, что что-то не так с моим подходом.Я понял, что не упомянул, что проводил эти тесты в Почтальоне, где я и увидел проблему.После дальнейшего поиска я нашел сообщение на GitHub , которое, как мне казалось, было связано с тем, что я испытывал в Postman (зависание от большого количества полезных данных ответа).Похоже, что у Почтальона есть ограничение на количество «строк», которое он возвращает в ответе.Пост GitHub был запросом функции, чтобы увеличить количество строк.

Я не уверен, как обработать этот вопрос StackOverflow сейчас.Поскольку я не упомянул Почтальона в оригинальном сообщении, я не чувствую себя правым, просто отвечая на свой вопрос.Так что, думаю, я оставлю все как есть на пару дней, чтобы посмотреть, не вступит ли кто-нибудь в свои мысли, прежде чем я это сделаю.

1 Ответ

0 голосов
/ 11 июня 2018

Как оказалось, проблема была с Postman и размером полезной нагрузки ответа, который он в настоящее время поддерживает.Если вместо выбора «Отправить» я выберу «Отправить и загрузить в Postman», он загрузит объект JSON и откроет диалоговое окно, которое позволит мне сохранить его на локальном диске.Затем, когда я проверяю файл, я вижу, что объект json правильно отформатирован и передан.

Я подтвердил, что это была только проблема Postman, а не проблема .NET HttpResponse, выполнив вызов API в клиентском приложении .Net, которое смогло получить объект Json без ошибок.

...