Получение значения ObjectResult из HttpContext - PullRequest
0 голосов
/ 02 мая 2020

Представляем JustController:

// many using directives

namespace MyWebApiProject.Controllers
{
    [Route("api/[controller].[action]")]
    [ApiController]
    public class JustController : ControllerBase
    {
        [HttpPost]
        public async Task<ActionResult> GetById(/*Model Class*/ body)
        {
            return StatusCode(/* http status code */, "THIS IS NEEDED VALUE"); // <- Look at this!
        }
    }
}

У нас также есть промежуточное ПО:

// many using directives

public class StatusCodeMiddleware
{
    private readonly RequestDelegate _next;

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

    public async Task InvokeAsync(HttpContext httpContext)
    {
        await _next(httpContext);
        /*
            How to get "THIS IS NEEDED VALUE" from HttpContext here
        */
    }
}

public static class StatusCodeMiddlewareExtensions // For convenient use in Startup.cs
{
    public static void ConfigureCustomStatusCodeMiddleware(this IApplicationBuilder app)
    {
        app.UseMiddleware<StatusCodeMiddleware>();
    }
}

Startup.cs:

public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
    app.ConfigureCustomStatusCodeMiddleware();

    app.UseRouting();

    app.UseEndpoints(endpoints => { endpoints.MapControllers(); });
}

Как получить «ЭТО НУЖНО ЗНАЧЕНИЕ» из HttpContext внутри метода InvokeAsyn c (), внутри StatusCodeMiddleware?

Заранее спасибо! Я действительно надеюсь, что аудитория Stack Overflow поможет мне! Я гуглил решение этой проблемы 2 дня, поэтому ничего не нашел. Извините за мой плохой Энгли sh!

1 Ответ

0 голосов
/ 02 мая 2020

Для этого нужно немного поиграться с потоками. Это не красиво, но если вам действительно нужно сделать это в промежуточном программном обеспечении, вы можете сделать это, как предложено в ответе здесь :

public async Task InvokeAsync(HttpContext httpContext)
{
    Stream originalBody = context.Response.Body;

    try
    {
        using (var memStream = new MemoryStream())
        {
            context.Response.Body = memStream;

            await next(context);

            memStream.Position = 0;
            string responseBody = new StreamReader(memStream).ReadToEnd();

            // Here responseBody == "THIS IS NEEDED VALUE"

            memStream.Position = 0;
            await memStream.CopyToAsync(originalBody);
        }
    }
    finally
    {
        context.Response.Body = originalBody;
    }
}
...