Заголовки уже отправлены в .net 5

У нас есть промежуточное программное обеспечение в веб-API, которое мы используем для фильтрации тела ответа от контроллера. После обновления нашей службы до .net 5 замена вывода не выполняется на

      System.InvalidOperationException: Headers already sent.
         at Microsoft.AspNetCore.Server.HttpSys.Response.CheckResponseStarted()
         at Microsoft.AspNetCore.Server.HttpSys.FeatureContext.ConsiderEnablingResponseCache()
         at Microsoft.AspNetCore.Server.HttpSys.FeatureContext.OnResponseStart()
         at Microsoft.AspNetCore.Server.HttpSys.FeatureContext.CompleteAsync()
         at Microsoft.AspNetCore.Server.HttpSys.RequestContext.Execute()
         at Microsoft.AspNetCore.Server.HttpSys.RequestContext.Execute()

Наше промежуточное ПО для фильтрации вывода выглядит примерно так

      internal class FilterOutput : IMiddleware
{
    public async Task InvokeAsync(HttpContext context, RequestDelegate next)
    {
        var originalBodyStream = context.Response.Body;
        var tempResponseBody = new MemoryStream();
        context.Response.Body = tempResponseBody;
        context.Response.OnStarting(async state =>
        {
            await FilterResponse(context, tempResponseBody, originalBodyStream);
        }, context);
        await next(context);
    }

    private async Task FilterResponse(HttpContext context, MemoryStream tempResponseBody, Stream originalBodyStream)
    {
        if (context.Response.StatusCode == 200)
        {
            var output = Encoding.UTF8.GetString(tempResponseBody.GetBuffer());
            var newOutput = output.Filter(null);

            var updatedStream = GenerateStreamFromString(newOutput);
            await updatedStream.CopyToAsync(originalBodyStream);
            context.Response.Body = originalBodyStream;
            return;
        }
        await tempResponseBody.CopyToAsync(originalBodyStream);
    }

    public static Stream GenerateStreamFromString(string s)
    {
        var stream = new MemoryStream();
        var writer = new StreamWriter(stream);
        writer.Write(s);
        writer.Flush();
        stream.Position = 0;
        return stream;
    }
}

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

0 ответов

Другие вопросы по тегам