ASP.NET Core上不正确的HttpStatus代码

时间:2018-07-13 10:21:38

标签: exception asp.net-core middleware

我在ASP.NET Core应用程序上有一个异常中间件,它可以做到这一点:

df['a'] = df['on_pm_at'].dt.to_period('m').dt.to_timestamp('m')
now = pd.Timestamp(pd.datetime.now()).to_period('m').to_timestamp('m')
2018-07-31 00:00:00

df1 = pd.concat([pd.Series(r.user_id,pd.date_range(r.a, now, freq='m')) 
                 for r in df.itertuples()]).reset_index()
df1.columns = ['months','user_id']
print (df1)
      months  user_id
0 2018-06-30     2124
1 2018-07-31     2124
2 2018-02-28    18420
3 2018-03-31    18420
4 2018-04-30    18420
5 2018-05-31    18420
6 2018-06-30    18420
7 2018-07-31    18420

在此示例中,我们发送“ Forbidden”(403 http状态码),但我总是收到500 。我在Swagger和Google Chrome上进行了检查,但不了解原因。

1 个答案:

答案 0 :(得分:0)

您可能已经在管道中的错误位置注册了中间件。您将中间件放置在startup.cs中的顺序会有所不同。例如:

public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
    app.Use(async (context, next) =>
    {
        try
        {
            await next();
        }
        catch (Exception ex)
        {
            context.Response.StatusCode = StatusCodes.Status403Forbidden;

            await context.Response.WriteAsync(ex.Message);
        }
    });

    if (env.IsDevelopment())
    {
        app.UseDeveloperExceptionPage();
    }
    else
    {
        app.UseExceptionHandler("/Error");
        app.UseHsts();
    }

    app.UseHttpsRedirection();
    app.UseStaticFiles();
    app.UseCookiePolicy();

    app.UseMvc();
}

在上面的代码中,我已经在管道开始时注册了与您相似的中间件。 ASP.NET Core将按照您放置请求的顺序处理所有请求,因此我的自定义中间件将首先针对请求运行。但是,响应是从下至上处理的。因此,在该示例中,当在控制器(或任何地方)中引发异常时,UseDeveloperExceptionPageUseExceptionHandler将首先接收任何异常,对其进行处理并将状态码更改为500。

如果我们将顺序更改为此:

public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
    if (env.IsDevelopment())
    {
        app.UseDeveloperExceptionPage();
    }
    else
    {
        app.UseExceptionHandler("/Error");
        app.UseHsts();
    }

    app.Use(async (context, next) =>
    {
        try
        {
            await next();
        }
        catch (Exception ex)
        {
            context.Response.StatusCode = StatusCodes.Status403Forbidden;

            await context.Response.WriteAsync(ex.Message);
        }
    });

    app.UseHttpsRedirection();
    app.UseStaticFiles();
    app.UseCookiePolicy();

    app.UseMvc();
}

现在,我们已将处理程序注册为针对请求的内置异常处理程序之后,更重要的是,对于响应而言,在其之前。因此,在这种情况下,当控制器引发异常时,我们的处理程序将捕获该异常,对其进行处理并将状态代码更改为所需的状态。其他异常处理程序将看不到该异常(除非另一个中间件处理程序在我们之后引发异常)。