не копировал в моем случае. я использовал

всех сил пытался получитьResponse.Body свойство действия ASP.NET Core и единственное решение, которое я смог определить, кажется неоптимальным. Решение требует заменыResponse.Body сMemoryStream во время чтения потока в строковую переменную, а затем обменять его обратно перед отправкой клиенту. В приведенных ниже примерах я пытаюсь получитьResponse.Body значение в пользовательском классе промежуточного программного обеспечения.Response.Body этозадавать единственное свойство в ASP.NET Core по какой-то причине? Я просто что-то здесь упускаю, или это проблема надзора / ошибки / дизайна? Есть ли лучший способ читатьResponse.Body?

Текущее (неоптимальное) решение:

public class MyMiddleWare
{
    private readonly RequestDelegate _next;

    public MyMiddleWare(RequestDelegate next)
    {
        _next = next;
    }

    public async Task Invoke(HttpContext context)
    {
        using (var swapStream = new MemoryStream())
        {
            var originalResponseBody = context.Response.Body;

            context.Response.Body = swapStream;

            await _next(context);

            swapStream.Seek(0, SeekOrigin.Begin);
            string responseBody = new StreamReader(swapStream).ReadToEnd();
            swapStream.Seek(0, SeekOrigin.Begin);

            await swapStream .CopyToAsync(originalResponseBody);
            context.Response.Body = originalResponseBody;
        }
    }
}  

Попытка решения с использованием EnableRewind (): Это работает только дляRequest.BodyнеResponse.Body, Это приводит к чтению пустой строки изResponse.Body а не фактическое содержание тела ответа.

Startup.cs

public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory, IApplicationLifetime appLifeTime)
{
    loggerFactory.AddConsole(Configuration.GetSection("Logging"));
    loggerFactory.AddDebug();

    app.Use(async (context, next) => {
        context.Request.EnableRewind();
        await next();
    });

    app.UseMyMiddleWare();

    app.UseMvc();

    // Dispose of Autofac container on application stop
    appLifeTime.ApplicationStopped.Register(() => this.ApplicationContainer.Dispose());
}

MyMiddleWare.cs

public class MyMiddleWare
{
    private readonly RequestDelegate _next;

    public MyMiddleWare(RequestDelegate next)
    {
        _next = next;
    }

    public async Task Invoke(HttpContext context)
    {
        await _next(context);
        string responseBody = new StreamReader(context.Request.Body).ReadToEnd(); //responseBody is ""
        context.Request.Body.Position = 0;
    }
}  

Ответы на вопрос(3)

Ваш ответ на вопрос