C# 后台任务的全局异常处理

C# 后台任务的全局异常处理,c#,asp.net-core,scheduled-tasks,C#,Asp.net Core,Scheduled Tasks,我一直在从事一个.net核心api项目,并基于这个示例(在解决方案中)实现了一个后台任务。 我已经在为我的api控制器使用一些全局异常处理,根据需要,我必须删除所有try-catch语句,并给出简单的HttpStatusCodes 我也需要为我的后台任务创建一个全局异常处理类,该类将从任何其他类继承,并通过记录异常来发挥其“魔力”,而不会使系统崩溃。我还必须避免每个请求都使用try/catch语句 到目前为止我的代码 招待所 public class MyHostedService : Cust

我一直在从事一个.net核心api项目,并基于这个示例(在解决方案中)实现了一个后台任务。 我已经在为我的api控制器使用一些全局异常处理,根据需要,我必须删除所有try-catch语句,并给出简单的HttpStatusCodes

我也需要为我的后台任务创建一个全局异常处理类,该类将从任何其他类继承,并通过记录异常来发挥其“魔力”,而不会使系统崩溃。我还必须避免每个请求都使用try/catch语句

到目前为止我的代码 招待所

public class MyHostedService : CustomExceptionFilter, IHostedService
    {
        private Timer _timer;
        private readonly IServiceScopeFactory _scopeFactory;

        private readonly ILogger _logger;

        public SchedulerHostedService(IServiceScopeFactory scopeFactory)
        {
            _scopeFactory = scopeFactory;

            _logger = new LoggerManager();

        }
        public Task StartAsync(CancellationToken cancellationToken)
        {

            _logger.Info("Background Service is starting");
            _timer = new Timer(ExecuteTask, null, TimeSpan.Zero, TimeSpan.FromMinutes(30));
            return Task.CompletedTask;

        }

        private void ExecuteTask(object state)
        {
            _ = ExecuteTaskOperationAsync();
        }



        private async Task ExecuteTaskOperationAsync()
        {
            using (IServiceScope scope = _scopeFactory.CreateScope())
            {
                IAsyncTask service = scope.ServiceProvider
                    .GetRequiredService<IAsyncTask>();
                await service.CustomTaskAsync();
            }
        }

        public Task StopAsync(CancellationToken cancellationToken)
        {
            _logger.Info("Background Service is stopping");
            _timer?.Change(Timeout.Infinite, 0);
            return Task.CompletedTask;
        }

        public void Dispose()
        {
            _timer?.Dispose();
        }
    }
我的过滤器

public class CustomExceptionFilter : IExceptionFilter
{

    public void OnException(ExceptionContext context)
     {
        //Some logic for handling exceptions.
     }
}
在我的Startup.cs服务中

services.AddHostedService<MyHostedService>();
services.AddScoped<IAsyncTask, DbInternalOperation >();
services.AddMvc(options=>options.Filters.Add(new CustomExceptionFilter()));
services.AddHostedService();
services.addScope();
services.AddMvc(options=>options.Filters.Add(newcustomexceptionfilter());
我期望通过抛出一个异常让系统进入“OneException”方法并完成它的工作,但它没有

我的结构有什么问题? 是否无法从继承自IEExceptionFilter的任何服务捕获任何异常?
如果有人能提供一个基本的异常过滤器实现,用于我的后台任务,而无需try/catch,我将不胜感激。

过滤器和中间件仅适用于MVC管道,需要请求,否则管道无法启动。
IHostedService
的实现由
主机(ASP.NET核心>=3.0)或
WebHost(ASP.NET核心<3.0)触发,不在MVC管道内运行

经典的
try{}catch(异常e)
就是您在这里需要的

一些资料来源:

感谢您直截了当的回答和解释。这是否意味着不在MVC管道下运行的任何其他服务(IHostedService的实现除外)都不会触发过滤器/中间件?是否可以用一个方法实现某种baseservice,该方法将另一个方法作为参数(使用委托),并在那里使用try-catch?类似于
publicvoidtrymethod(Func-MyMethod){try{MyMethod}catch(异常e){{u logger.Info(e.Message);}}}
是的,完全正确。托管服务与MVC管道无关,也可以在控制台应用程序中使用。是的,那是可能的。在这种情况下,您应该使用异步方法。
services.AddHostedService<MyHostedService>();
services.AddScoped<IAsyncTask, DbInternalOperation >();
services.AddMvc(options=>options.Filters.Add(new CustomExceptionFilter()));