Как изменить код состояния http после начала записи в поток HttpContext.Response.Body в ASP.NET Core? - PullRequest
0 голосов
/ 11 ноября 2018

Я часто вижу, что запись в поток HttpContext.Response.Body - это плохая практика (или использование PushStreamContent или StreamContent в качестве части HttpMessageResponse), поэтому вы не можете изменить код состояния HTTP, если происходит что-то не так.

Есть ли обходной путь для фактической async записи в выходной поток при возможности изменения кода состояния HTTP в случае сбоя операции?

1 Ответ

0 голосов
/ 11 ноября 2018

Да. Лучшая практика - написать Middleware. Например:

public class ErrorWrappingMiddleware
{
    private readonly RequestDelegate next;

    public ErrorWrappingMiddleware(RequestDelegate next)
    {
        this.next = next;
    }

    public async Task Invoke(HttpContext context)
    {
        try
        {
            await next.Invoke(context);
        }
        catch (Exception exception)
        {
            context.Response.StatusCode = 500;
            await context.Response.WriteAsync(...); // change you response body if needed
        }
    }
}

и добавьте их в свой конвейер

public void Configure(IApplicationBuilder app, IHostingEnvironment env, IServiceProvider serviceProvider)
{
...
app.UseMiddleware<ErrorWrappingMiddleware>();
...
}

И, конечно, вы можете изменить свою логику в своем промежуточном программном обеспечении по своему усмотрению, включая изменение кода ответа по своему усмотрению. Кроме того, вы можете выбросить свой собственный тип исключения, например MyOwnException, затем перехватить его в промежуточном программном обеспечении и вызвать собственную логику, связанную с вашим исключением.

...