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