Привязка необработанного тела запроса к ядру. net без чтения потока запроса. - PullRequest
0 голосов
/ 12 апреля 2020

Один из наших клиентов настаивает на отправке необработанного тела запроса нашему 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

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

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

Спасибо.

1 Ответ

0 голосов
/ 12 апреля 2020

для чтения тела запроса в .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;
}
...