Один из наших клиентов настаивает на отправке необработанного тела запроса в наш API (не json или xml), и поскольку ядро ​​.net не поддерживает его по умолчанию, я использовал аналогичную идею с приведенной ниже:

[HttpPost]
[Route("example/{path}")]
public async Task<string> ReadStringDataManual(string path)
{
    using (StreamReader reader = new StreamReader(Request.Body, Encoding.UTF8))
    {  
        return await reader.ReadToEndAsync();
    }
}

Однако в процессе производства мы поняли, что API выдает исключение, указанное ниже, при загрузке.

System.Runtime.CompilerServices.TaskAwaiter:UnsafeOnCompletedInternal (method time = 1 ms, total time = 1 ms)
undefined(2011ms): await continuation

Я не уверен, связано ли это с Kestrel или нет, но я считаю, что это из-за обширной операции ввода-вывода. Я тоже попробовал наивный способ - добавить параметр с атрибутом [FromBody] в сигнатуру метода, но безуспешно.

Есть ли другой вариант чтения необработанного тела запроса без использования потокового считывателя?

Спасибо.

0
skynyrd 12 Апр 2020 в 09:22

1 ответ

Лучший ответ

Чтение тела запроса в .NetCore немного отличается

[HttpPost]
[Route("example/{path}")]
public async Task<string> ReadStringDataManual(string path)
{

    ReadResult requestBodyInBytes = await Request.BodyReader.ReadAsync();
    Request.BodyReader.AdvanceTo(requestBodyInBytes.Buffer.Start, requestBodyInBytes.Buffer.End);
    string body = Encoding.UTF8.GetString(requestBodyInBytes.Buffer.FirstSpan);

    //Rest of the code

    return body;
}
1
TiGreX 16 Апр 2020 в 15:08