我遵循以下链接;
自定义HttpResponseException中间件Asp.Net Core2.0
现在,我想向响应正文添加一条消息,以便为异常提供上下文。
我对中间件调用方法进行了如下修改;
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();
}
}但是,当将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>();
}
}
}HttpStatusCodeException类如下;
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;
}
}发布于 2018-03-15 08:27:01
这
await context.Response.WriteAsync(exception.Message);
context.Response.Headers.Clear();无法工作,因为在您发送响应后(通过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.UseMvc();
app.UseHttpErrorHandlerMiddleware();https://stackoverflow.com/questions/49293562
复制相似问题