【发布时间】:2018-08-15 14:50:43
【问题描述】:
我有一个应用程序,我需要在返回响应之前仅应用逻辑格式错误的请求(状态代码:400)。
为此,我研究了 ASP.NET Core 中的错误处理,并基于此solution 我尝试了以下操作:
public class ErrorHandlingMiddleware
{
private readonly RequestDelegate next;
public ErrorHandlingMiddleware(RequestDelegate next)
{
this.next = next;
}
public async Task Invoke(HttpContext context /* other dependencies */)
{
try
{
await next(context);
}
catch (Exception ex)
{
await HandleExceptionAsync(context, ex);
}
}
private static Task HandleExceptionAsync(HttpContext context, Exception exception)
{
if (context.Response.StatusCode == StatusCodes.Status400BadRequest)
{
//apply logic
}
var result = JsonConvert.SerializeObject(new { error = exception.Message });
context.Response.ContentType = "application/json";
context.Response.StatusCode = (int)StatusCodes.Status400BadRequest;
return context.Response.WriteAsync(result);
}
}
在启动中:
public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
}
app.UseMiddleware(typeof(ErrorHandlingMiddleware));
app.UseMvc();
}
不幸的是,上面的解决方案不起作用,当我调试时,我发现context.Response.StatusCode 始终是 200,即使请求格式不正确。
我在这里缺少什么?任何见解将不胜感激。
【问题讨论】:
-
删除
appsettings.json中的日志选项 -
格式错误的请求是什么意思?你确定抛出了异常吗?
-
我是指请求与action参数不匹配时ASP.Net返回的默认响应
-
那么这是错误的行为。这将使每个以任何异常结束的请求都返回 400(错误请求),而它也可能返回 500(内部服务器错误)。改用异常过滤器并定义适当的异常。您可以使用 ModelState-Validation 或 FluentValidation。 github.com/alsami/exception-filter-aspnet-coredocs.microsoft.com/en-us/aspnet/core/mvc/models/…github.com/JeremySkinner/FluentValidation
-
是的,你是对的,逻辑有缺陷,但目前的主要问题是执行永远不会进入 HandleExceptionAsync
标签: c# asp.net-core middleware