【发布时间】:2018-11-21 04:07:57
【问题描述】:
与处理 HTTP 5xx 错误的 UseExceptionHandler 类似,ASP.NET CORE 2 是否提供任何处理程序来处理 HTTP 4xx 错误。
在这里,我试图捕捉在请求处理管道期间产生的任何 HTTP 4xx 错误,并将其发送回消费者。
【问题讨论】:
标签: c# asp.net-core-2.1
与处理 HTTP 5xx 错误的 UseExceptionHandler 类似,ASP.NET CORE 2 是否提供任何处理程序来处理 HTTP 4xx 错误。
在这里,我试图捕捉在请求处理管道期间产生的任何 HTTP 4xx 错误,并将其发送回消费者。
【问题讨论】:
标签: c# asp.net-core-2.1
您可以创建一个新的中间件来处理您的异常:
public class ErrorHandlingMiddleware
{
private readonly RequestDelegate _next;
/// <summary>
/// Default constructor
/// </summary>
/// <param name="next">Next request in the pipeline</param>
public ErrorHandlingMiddleware(RequestDelegate next)
{
_next = next;
}
/// <summary>
/// Entry point into middleware logic
/// </summary>
/// <param name="context">Current http context</param>
/// <returns></returns>
public async Task Invoke(HttpContext context)
{
try
{
await _next(context);
}
catch (HttpException httpException)
{
context.Response.StatusCode = httpException.StatusCode;
}
catch (Exception ex)
{
await HandleExceptionAsync(context, ex);
}
}
private static Task HandleExceptionAsync(HttpContext context, Exception exception)
{
var code = HttpStatusCode.InternalServerError; // 500 if unexpected
var result = JsonConvert.SerializeObject(new { Error = "Internal Server error" });
context.Response.ContentType = "application/json";
context.Response.StatusCode = (int)code;
return context.Response.WriteAsync(result);
}
}
在您的Startup.cs 中像这样使用它
public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
}
app.UseMiddleware(typeof(ErrorHandlingMiddleware));
app.UseMvc();
}
【讨论】:
By default, an app doesn't provide a rich status code page for HTTP status codes, such as 404 Not Found. To provide status code pages, use Status Code Pages Middleware. 据此:docs.microsoft.com/en-us/aspnet/core/fundamentals/… 我认为您应该使用 StatusCodePages。但是在 WEB API 中你不应该返回 HTML。您应该返回某种类型的可序列化数据,这是我的中间件通过返回 JSON 所做的。看看他们的例子,他们返回纯文本结果。