Возможно, вы зарегистрировали промежуточное ПО не в том месте конвейера. Порядок, в котором вы размещаете промежуточное ПО в 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();
}
Теперь мы зарегистрировали наш обработчик после встроенного обработчика исключений для запроса, но, что более важно, перед ним для ответа. Итак, в этом случае, когда контроллер выдает исключение, наш обработчик поймает его, обработает и изменит код состояния на то, что мы хотим. Другие обработчики исключений не увидят исключение (если только другой промежуточный обработчик не сгенерирует исключение после нас).
13.07.2018