当前位置: 首页 > 知识库问答 >
问题:

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

诸葛康胜
2023-03-14
public async void OnAuthorization(AuthorizationFilterContext context){
     Convert.ToInt32("NotConvertable");
}
try
{
    await _next(context);
}
catch (Exception ex)
{
    _logger.LogError("FATAL ERROR", ex);
}

但这无济于事,仍然令人崩溃。

我在考虑make try{}catch返回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()
    {
         ...
    }
}
... 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()));
         }

共有1个答案

权浩邈
2023-03-14

假设您将在某些方法中抛出一些特定的异常,而另一些方法只想作为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);
                    }
                });
            });
        }
    }

然后您只需在Startup Configure中注册它:

public void Configure(IApplicationBuilder app)
        {
            ...

            app.UseCustomExceptionHandler();

            ...
        }

不要在授权筛选器中引发异常:

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

考虑在授权筛选器中发生异常时发出质询

您可以在这里阅读更多关于它的信息:https://docs.microsoft.com/en-us/aspnet/core/mvc/controllers/filters?view=aspnetcore-3.1#action-filters

 类似资料:
  • 为什么全局异常处理不能处理筛选器中引发的异常? 我的代码现在是这样的:

  • 我想在Spring中处理某些异常并将REST响应包装成另一种对象格式。 因此,我想到了使用过滤器并检查响应状态代码的想法,例如,如果是400,则意味着请求不正确,因此我可以将响应包装为所需的JSON格式,下面是代码示例: 将特定异常的响应封装在过滤器中是一种好方法吗?这种情况的缺点是什么?

  • .NET核心和ASP.NET核心到底有什么区别?

  • 24.2 核心编译的前处理与核心功能选择 什么?核心编译还要进行前处理?没错啦!事实上,核心的目的在管理硬件与提供系统核心功能,因此你必须要先找到你的系统硬件, 并且规划你的主机未来的任务,这样才能够编译出适合你这部主机的核心!所以,整个核心编译的重要工作就是在“挑选你想要的功能”。 下面鸟哥就以自己的一部主机软/硬件环境来说明,解释一下如何处理核心编译啰! 24.2.1 硬件环境检视与核心功能要

  • 我正在使用 ASP.NET 核心 RazorPage 作为 MVC 控制器的替代方案,我希望能够通过 XMLHttpRequest 提交客户端表单。我已经弄清楚了XSRF令牌位,以便通过集合,但是RazorPages框架似乎没有处理入站JSON有效负载并将其绑定到属性。 一些代码: 页面的模型(.cshtml.cs): 和客户端帖子: 我已验证数据是否正确提交: 在提交请求之前,axios会添加X