【问题标题】:ASPNET Core apply logic when Badly formed requests are received收到格式错误的请求时,ASPNET Core 应用逻辑
【发布时间】: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


【解决方案1】:

试试看Response Status

        if (env.IsDevelopment())
        {
            app.UseBrowserLink();
            app.UseDeveloperExceptionPage();
        }
        else
        {
            app.UseExceptionHandler("/Home/Error");
        }
        app.Use(async (context,next) => {
            await next();
            if (context.Response.StatusCode == StatusCodes.Status400BadRequest)
            {
                    var result = JsonConvert.SerializeObject(new { error = "Not Support" });
                    context.Response.ContentType = "application/json";
                    context.Response.StatusCode = (int)StatusCodes.Status400BadRequest;
                    await context.Response.WriteAsync(result);
            }
        });

【讨论】:

    猜你喜欢
    • 2011-06-14
    • 2019-11-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-04-25
    • 2014-07-13
    • 1970-01-01
    相关资源
    最近更新 更多