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();