C# 在中间件asp.net core 2中设置捕获错误的主体

C# 在中间件asp.net core 2中设置捕获错误的主体,c#,exception-handling,asp.net-core-2.0,asp.net-core-webapi,C#,Exception Handling,Asp.net Core 2.0,Asp.net Core Webapi,我遵循了以下链接 现在,我想在响应的主体中添加一条消息,为异常提供上下文 我修改了中间件调用方法,如下所示 public async Task Invoke(HttpContext context) { try { await _next(context); } catch (HttpStatusCodeException exception) { c

我遵循了以下链接

现在,我想在响应的主体中添加一条消息,为异常提供上下文

我修改了中间件调用方法,如下所示

    public async Task Invoke(HttpContext context)
    {
        try
        {
            await _next(context);
        }
        catch (HttpStatusCodeException exception)
        {
            context.Response.StatusCode = (int)exception.StatusCode;
            // byte[] data = Encoding.UTF8.GetBytes(exception.Message);
            // await context.Response.Body.WriteAsync(data, 0, data.Length);
            await context.Response.WriteAsync(exception.Message);
            context.Response.Headers.Clear();
        }
    }
    public class HttpStatusCodeException : Exception
{
    public HttpStatusCode StatusCode { get; set; }

    public HttpStatusCodeException(HttpStatusCode statusCode)
    {
        StatusCode = statusCode;
    }

    public HttpStatusCodeException(HttpStatusCode statusCode, string message) : base(message)
    {
        StatusCode = statusCode;
    }

}
但是,在将WriteAsync行添加到方法时,我没有从Api获得响应(我正在通过postman进行测试)

有谁能告诉我我做错了什么

下面是类和中间件的完整代码

namespace Services.WebApi.Middleware
{
    public class HttpErrorHandlerMiddleware
    {

        private readonly RequestDelegate _next;

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

        public async Task Invoke(HttpContext context)
        {
            try
            {
                await _next(context);
            }
            catch (HttpStatusCodeException exception)
            {
                context.Response.StatusCode = (int)exception.StatusCode;
                // byte[] data = Encoding.UTF8.GetBytes(exception.Message);
                // await context.Response.Body.WriteAsync(data, 0, data.Length);
                await context.Response.WriteAsync(exception.Message);
                context.Response.Headers.Clear();
            }
        }
    }

    public static class HttpErrorHandlerMiddlewareExtensions
    {
        public static IApplicationBuilder UseHttpErrorHandlerMiddleware(this IApplicationBuilder builder)
        {
            return builder.UseMiddleware<HttpErrorHandlerMiddleware>();
        }
    }
}
这个

将不起作用,因为在发送响应后(通过
Response.WriteAsync
)-无法更改\清除标头,因为标头在响应正文之前发送,因此此时已发送到客户端。只需按如下方式更改顺序:

context.Response.Headers.Clear();
await context.Response.WriteAsync(exception.Message);
它应该像预期的那样工作。同样值得检查的是,此时尚未启动响应:

if (!context.Response.HasStarted) {
    context.Response.Headers.Clear();
    await context.Response.WriteAsync(exception.Message);
}
还要确保在注册其他中间件之前先注册中间件。对:

app.UseHttpErrorHandlerMiddleware();
app.UseMvc();


希望这能在一定程度上帮助你。我做得很好,谢谢你对这个问题和最后一个问题的帮助。我还想说,你的解释也很贴切,很好地解释了情况。
app.UseHttpErrorHandlerMiddleware();
app.UseMvc();
app.UseMvc();
app.UseHttpErrorHandlerMiddleware();