Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-core/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Asp.net core ASP.NET核心应用程序中的后台服务_Asp.net Core_Asp.net Core Hosted Services - Fatal编程技术网

Asp.net core ASP.NET核心应用程序中的后台服务

Asp.net core ASP.NET核心应用程序中的后台服务,asp.net-core,asp.net-core-hosted-services,Asp.net Core,Asp.net Core Hosted Services,我使用ASP.NET Core 2.1构建了一个API,它可以执行一些基本的CRUD操作 这是一种发布管道应用程序,专门用于我们的内部流程。其工作原理如下: 用户请求重新加载数据(POST) 用户批准数据重新加载(POST) 用户启动数据库中的SSIS包,该包将触发数据重新加载(POST) 后台进程检查该SSIS包的状态,并在完成时将重新加载的状态设置为“完成/失败” 我们最初的想法是创建一个后台服务,定期查询数据库并检查SSIS包的当前状态,然后将实体更新到所需状态(完成/失败) 但是,这不起

我使用ASP.NET Core 2.1构建了一个API,它可以执行一些基本的CRUD操作

这是一种发布管道应用程序,专门用于我们的内部流程。其工作原理如下:

  • 用户请求重新加载数据(POST)
  • 用户批准数据重新加载(POST)
  • 用户启动数据库中的SSIS包,该包将触发数据重新加载(POST)
  • 后台进程检查该SSIS包的状态,并在完成时将重新加载的状态设置为“完成/失败”
  • 我们最初的想法是创建一个后台服务,定期查询数据库并检查SSIS包的当前状态,然后将实体更新到所需状态(完成/失败)

    但是,这不起作用,因为所有其他服务都是作用域,而后台服务是单例服务


    为了维护实体的正确状态,运行后台服务的替代方案是什么?一个单独的项目?

    我最近在API中创建了一个后台服务,下面的解决方案适合我:

  • 在后台服务类构造函数中,将IServiceProvider添加为依赖项:

    private readonly IServiceProvider _serviceProvider;
    
    public MyBackgoundService(IServiceProvider serviceProvider)
    {
         _serviceProvider = serviceProvider;
    
    }
    
  • 在实现代码中,使用服务提供者注入数据库上下文或存储库

    protected override async Task ExecuteAsync(CancellationToken stoppingToken)
    {        
        while(!stoppingToken.IsCancellationRequested){
    
                using var scope = _serviceProvider.CreateScope();
                var context = scope.ServiceProvider.GetRequiredService<MyDbContext>();
    
         }
    }
    
    受保护的覆盖异步任务ExecuteAsync(CancellationToken stoppingToken)
    {        
    同时(!stoppingToken.IsCancellationRequested){
    使用var scope=_serviceProvider.CreateScope();
    var context=scope.ServiceProvider.GetRequiredService();
    }
    }
    

  • 后台服务是托管服务,托管服务可以注入
    IServiceProvider
    。因此,您可以创建一个新的作用域,在其中您可以安全地引用一个新的作用域服务。请使用IServiceScopeFactory而不是IServiceProvider。@alsami如果您觉得有必要将一篇文章标记为之前已回答的文章,并在评论中说明,那么至少您最好在之前讨论过的问题的地方发布一个链接。目前,这篇文章是“asp.net核心后台服务”的第一次堆栈溢出搜索,鉴于此,您的评论看起来有点矛盾,没有帮助。对于那些提出此问题的人,请阅读以下有趣的文章。