我在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上进行了检查,但不了解原因。
答案 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将按照您放置请求的顺序处理所有请求,因此我的自定义中间件将首先针对请求运行。但是,响应是从下至上处理的。因此,在该示例中,当在控制器(或任何地方)中引发异常时,UseDeveloperExceptionPage
或UseExceptionHandler
将首先接收任何异常,对其进行处理并将状态码更改为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();
}
现在,我们已将处理程序注册为针对请求的内置异常处理程序之后,更重要的是,对于响应而言,在其之前。因此,在这种情况下,当控制器引发异常时,我们的处理程序将捕获该异常,对其进行处理并将状态代码更改为所需的状态。其他异常处理程序将看不到该异常(除非另一个中间件处理程序在我们之后引发异常)。