首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >中间件asp.net内核2捕获错误的设置

中间件asp.net内核2捕获错误的设置
EN

Stack Overflow用户
提问于 2018-03-15 07:18:27
回答 1查看 1.3K关注 0票数 2

我遵循以下链接;

自定义HttpResponseException中间件Asp.Net Core2.0

现在,我想向响应正文添加一条消息,以便为异常提供上下文。

我对中间件调用方法进行了如下修改;

代码语言:javascript
复制
    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进行测试)。

有人能告诉我我在这里做错了什么吗?

类和中间件的完整代码如下;

代码语言:javascript
复制
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类如下;

代码语言:javascript
复制
    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;
    }

}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-03-15 08:27:01

代码语言:javascript
复制
await context.Response.WriteAsync(exception.Message);
context.Response.Headers.Clear();

无法工作,因为在您发送响应后(通过Response.WriteAsync) -标头不能更改\清除,因为报头在响应体之前发送,因此此时已发送到客户端。只需像这样改变顺序:

代码语言:javascript
复制
context.Response.Headers.Clear();
await context.Response.WriteAsync(exception.Message);

而且它应该能像预期的那样起作用。还值得检查的是,目前还没有开始作出回应:

代码语言:javascript
复制
if (!context.Response.HasStarted) {
    context.Response.Headers.Clear();
    await context.Response.WriteAsync(exception.Message);
}

还要确保在其他中间件之前注册您的中间件。右图:

代码语言:javascript
复制
app.UseHttpErrorHandlerMiddleware();
app.UseMvc();

不对

代码语言:javascript
复制
app.UseMvc();
app.UseHttpErrorHandlerMiddleware();
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/49293562

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档