处理ASP.NET Core筛选器引发的异常

我使用了很多asp.net核心筛选器。
我正在寻找一种优雅的方法来处理过滤器可能引发的异常。

例如这样的过滤器:

public async void OnAuthorization(AuthorizationFilterContext context){
     Convert.ToInt32("NotConvertable");
}

将抛出FormatException,这将使整个应用程序崩溃,这不是很酷。我想记录错误,返回500但没有应用程序崩溃。

我尝试在MVC之前添加中间件:

try
{
    await _next(context);
}
catch (Exception ex)
{
    _logger.LogError("FATAL ERROR", ex);
}

但这仍然无济于事。

我正在考虑使try {}赶上500,并在每个过滤器中进行某种日志记录,但这会导致大量重复。

有什么办法可以全局处理吗?

更多背景

  public class PermissionAttribute:TypeFilterAttribute
  {
       public PermissionAttribute():base(typeof(PermissionFilter))
       {
       }
  }

 public class PermissionFilter : IAuthorizationFilter
 {
      public async void OnAuthorization(AuthorizationFilterContext context)
      {
           Convert.ToInt32("NotConvertable");
      }
 }

和控制器:

[Route("api/nav/")]
public class AController : Controller{

    ...

    [HttpGet]
    [Route("{id}")]
    [PermissionAttribute]
    [ProducesResponseType(typeof(SomeClass), 200)]
    public async Task<SomeClass> GetAll()
    {
         ...
    }
}

将此端点称为粉碎整个过程

Startup.cs(简称)public void Configure(...某些服务){

... some app.Use UseLogger, HealthCheck
app.UseMiddleware<PleaseDontCrushMiddleware>(); // Middleware mentioned above
app.UseExceptionHandler(errorHandler.Handle);

a lot of middlewares

app.UseMvc(RouteTable);

}

MVC服务是通过以下方式添加的:

services.AddMvc(config =>
        {
            var policy = new AuthorizationPolicyBuilder()
                .RequireAuthenticatedUser()
                .Build();
            config.Filters.Add(new AuthorizeFilter(policy));
            config.Filters.Add(new ResponseCacheFilter(new CacheProfile()
            {
                NoStore = true,
                Location = ResponseCacheLocation.None
            }, 
            services.BuildServiceProvider().GetService<ILoggerFactory()));
         }
内曼娅·托多罗维奇(Nemanja Todorovic)

假设您将在某些方法中引发某些特定的异常,而其他方法仅想作为System.Exception捕获,则可以使用以下方法:

您可以创建异常处理扩展方法(如果您也想使用Logger,也可以在方法中添加ILogger参数并从Startup.Configure传递它):

public static class ExceptionHandler
    {
        /// <summary>
        /// 
        /// </summary>
        /// <param name="app"></param>
        public static void UseCustomExceptionHandler(this IApplicationBuilder app)
        {
            app.UseExceptionHandler(eApp =>
            {
                eApp.Run(async context =>
                {
                    context.Response.StatusCode = 500;
                    context.Response.ContentType = "application/json";

                    var errorCtx = context.Features.Get<IExceptionHandlerFeature>();
                    if (errorCtx != null)
                    {
                        var ex = errorCtx.Error;
                        var message = "Unspecified error ocurred.";
                        var traceId = traceIdentifierService.TraceId;

                        if (ex is ValidationException)
                        {
                            var validationException = ex as ValidationException;
                            context.Response.StatusCode = (int)HttpStatusCode.BadRequest;
                            message = string.Join(" | ", validationException.Errors.Select(v => string.Join(",", v.Value)));
                        }
                        else if (ex is SomeCustomException)
                        {
                            var someCustomException = ex as SomeCustomException;
                            ...
                        }

                        var jsonResponse = JsonConvert.SerializeObject(new ErrorResponse
                        {
                            TraceId = traceId,
                            Message = message
                        });
                        await context.Response.WriteAsync(jsonResponse, Encoding.UTF8);
                    }
                });
            });
        }
    }

然后您只需在启动配置中注册它:

public void Configure(IApplicationBuilder app)
        {
            ...

            app.UseCustomExceptionHandler();

            ...
        }

关于授权筛选器中的异常(来自Microsoft文档):

不要在授权过滤器中引发异常:

The exception will not be handled.
Exception filters will not handle the exception.

考虑在授权过滤器中发生异常时发出挑战

您可以在此处了解更多信息:https : //docs.microsoft.com/zh-cn/aspnet/core/mvc/controllers/filters?view=aspnetcore-3.1#action-filters

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

处理ASP .NET中的异常

来自分类Dev

ASP.NET Core Razor-全局异常处理程序

来自分类Dev

如何在ASP.NET Core中进行异常处理?

来自分类Dev

处理ASP.NET MVC控制器中的异常

来自分类Dev

ASP.NET Core MVC筛选器是否单例?

来自分类Dev

在 ASP.NET Core 中处理 ILoggerFactory

来自分类Dev

处理 ASP Net Core 路由中的“+”

来自分类Dev

Asp.Net OData V4:如何获取引发全局处理程序的异常?

来自分类Dev

当用户未分配给客户端应用程序时,使用 ASP.Net Core 的 OKTA 身份验证会引发未处理的异常

来自分类Dev

ASP.NET 5中的全局异常处理

来自分类Dev

Nido的ASP.NET C#异常处理

来自分类Dev

ASP.NET(C#)Web服务中的异常处理

来自分类Dev

C#和ASP .Net中的异常处理

来自分类Dev

通过Lambda表达式引发异常时如何在ASP.NET Web API中全局处理异常

来自分类Dev

具有请求/响应模式的ASP.NET Core Web API异常处理

来自分类Dev

WebApi和MVC(包括Razor页面)的Asp.net Core 3.0单独的全局异常处理

来自分类Dev

如何处理ASP.NET Core 3中400到500的异常

来自分类Dev

如何在ASP.NET Core中为gRPC服务添加全局异常处理程序?

来自分类Dev

Linux上ASP.Net Core Web API中未处理的异常

来自分类Dev

处理Asp.Net Core 3.1中SignalR集线器中的所有异常

来自分类Dev

ASP.NET MVC Core和Dapper中的全局异常/错误处理

来自分类Dev

ASP.NET Core:在当前页面显示异常消息的全局处理

来自分类Dev

通过中间件管道播种数据库引发异常 asp.net core

来自分类Dev

处理ASP.NET Core 1.0上的大文件上传

来自分类Dev

哪个组件在ASP.NET Core中处理线程分配?

来自分类Dev

ASP .Net Core排队的后台任务并行处理

来自分类Dev

ASP.Net Core 处理产品价格

来自分类Dev

ASP.Net Core:SSH 客户端的处理

来自分类Dev

ASP .NET筛选器URL参数

Related 相关文章

  1. 1

    处理ASP .NET中的异常

  2. 2

    ASP.NET Core Razor-全局异常处理程序

  3. 3

    如何在ASP.NET Core中进行异常处理?

  4. 4

    处理ASP.NET MVC控制器中的异常

  5. 5

    ASP.NET Core MVC筛选器是否单例?

  6. 6

    在 ASP.NET Core 中处理 ILoggerFactory

  7. 7

    处理 ASP Net Core 路由中的“+”

  8. 8

    Asp.Net OData V4:如何获取引发全局处理程序的异常?

  9. 9

    当用户未分配给客户端应用程序时,使用 ASP.Net Core 的 OKTA 身份验证会引发未处理的异常

  10. 10

    ASP.NET 5中的全局异常处理

  11. 11

    Nido的ASP.NET C#异常处理

  12. 12

    ASP.NET(C#)Web服务中的异常处理

  13. 13

    C#和ASP .Net中的异常处理

  14. 14

    通过Lambda表达式引发异常时如何在ASP.NET Web API中全局处理异常

  15. 15

    具有请求/响应模式的ASP.NET Core Web API异常处理

  16. 16

    WebApi和MVC(包括Razor页面)的Asp.net Core 3.0单独的全局异常处理

  17. 17

    如何处理ASP.NET Core 3中400到500的异常

  18. 18

    如何在ASP.NET Core中为gRPC服务添加全局异常处理程序?

  19. 19

    Linux上ASP.Net Core Web API中未处理的异常

  20. 20

    处理Asp.Net Core 3.1中SignalR集线器中的所有异常

  21. 21

    ASP.NET MVC Core和Dapper中的全局异常/错误处理

  22. 22

    ASP.NET Core:在当前页面显示异常消息的全局处理

  23. 23

    通过中间件管道播种数据库引发异常 asp.net core

  24. 24

    处理ASP.NET Core 1.0上的大文件上传

  25. 25

    哪个组件在ASP.NET Core中处理线程分配?

  26. 26

    ASP .Net Core排队的后台任务并行处理

  27. 27

    ASP.Net Core 处理产品价格

  28. 28

    ASP.Net Core:SSH 客户端的处理

  29. 29

    ASP .NET筛选器URL参数

热门标签

归档