Когда и как StreamReader должен быть удален, если основной поток не должен быть удален? - PullRequest
0 голосов
/ 22 апреля 2020

Я хочу десериализовать httpRequest.Body дважды в приложении asp. net core 3.0: один раз в промежуточном программном обеспечении и второй раз во время привязки модели.

Вот код из промежуточного программного обеспечения

 var streamReader = new StreamReader(httpRequest.Body)
 var body = streamReader.ReadToEndAsync();
 //some body processing

То же самое, что и в моем коде привязки

В соответствии с лучшими практиками, мне нужно разместить здесь объект StreamReader. Но если я распоряжусь им в промежуточном программном обеспечении, я получу исключение во время привязки - Cannot access a disposed object., так как StreamReader также удалит использованный Stream.

Так что мне здесь делать? Не распоряжаться StreamReader и позволить G C сделать это в будущем?

Может быть, это что-то известное и тривиальное, но я совершенно сбит с толку ...

1 Ответ

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

Благодаря помощи и ссылке, предоставленной @Damien_The_Unbeliever, следующий код позволит нам избавиться от StreamReader и избежать Stream удаления и последующего исключения в привязке модели.

public async Task InvokeAsync(HttpContext context, RequestDelegate next)
{
    context.Request.EnableBuffering();

    // Leave the body open so the next middleware can read it.
    using (var reader = new StreamReader(
        context.Request.Body,
        encoding: Encoding.UTF8,
        detectEncodingFromByteOrderMarks: false,
        bufferSize: bufferSize,
        leaveOpen: true))
{
    var body = await reader.ReadToEndAsync();
    // Do some processing with body…

    // Reset the request body stream position so the next middleware can read it
    context.Request.Body.Position = 0;
}

// Call the next delegate/middleware in the pipeline
await next(context);

}

...