问题标签 [asp.net-core-hosted-services]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
c# - IHostedService 可用于 Azure Functions 应用程序吗?
不管我们是否应该,我们可以IHostedService
在 Azure Functions App 中使用吗?
这是尝试将托管服务(特别是后台服务)注册为IHostedService
:
然后,函数应用程序会引发以下异常:
c# - 托管服务中数据库上下文的并发问题
我有一个托管服务,它通过 API 端点处理对象 PUT/POST,也就是说,一旦给出新实体或编辑现有实体,(a)托管服务开始处理它(一个长时间运行的过程), (b) 接收/修改的对象(作为 JSON 对象)返回给 API 调用者。
当 PUT/POST 一个实体时,我在这里和那里看到运行时错误(例如,在对象 JSON 序列化程序中)抱怨不同的问题,例如:
ObjectDisposedException:无法访问已处置的对象。此错误的一个常见原因是释放从依赖注入中解析的上下文,然后尝试在应用程序的其他地方使用相同的上下文实例。如果您在上下文上调用 Dispose() 或将上下文包装在 using 语句中,则可能会发生这种情况。如果你使用依赖注入,你应该让依赖注入容器负责处理上下文实例。
或者:
InvalidOperationException:在前一个操作完成之前在此上下文上启动了第二个操作。这通常是由使用相同 DbContext 实例的不同线程引起的。
最初我使用的是数据库上下文池,但据此,似乎池在托管服务方面存在已知问题。因此,我切换到了常规AddDbContext
;但是,这都没有解决问题。
这就是我定义数据库上下文和托管服务的方式:
并且我按以下方式访问托管服务中的数据库上下文(如此处推荐):
编辑 1
如前所述,错误发生在代码周围。但是,由于我提到了序列化程序上发生的错误,因此我将在以下内容中共享序列化程序代码:
更新 2
示例 API 端点如下所示:
c# - 如何为控制台应用程序设置 ASPNETCORE_ENVIRONMENT?
我有以下包含托管服务的简单控制台应用程序:
它适用于我的数据库,这意味着它需要连接字符串。我有三个appsettings.json
文件:
在开发服务器上,我将使用Development
环境,在生产服务器上 - Production
. 在我的本地机器上,我将使用Local
. 这很简单。我将在ASPNETCORE_ENVIRONMENT
(OS 环境变量)的帮助下得到它。
我使用 Linux,在我的 shell (zsh) 配置文件中我有:
当我输入我的终端时,$ echo $ASPNETCORE_ENVIRONMENT
我有Local
. 但是当我启动我的控制台应用程序时
它试图从Production
环境开始。查看调试输出:
那么如何设置环境呢?为什么 Os 变量不起作用?
.net-core - 在 .NET Core Worker 服务中根据配置注册托管服务
在 .NET core 3+ 工作服务中,我们可以使用CreateHostBuilder方法下的 ConfigureServices 注册多个工作服务,如下所示
有没有办法根据配置设置(例如appsettings.json)添加这些服务(TestWorker1,TestWorker2),以便只注册配置文件中定义的服务。
除了配置文件方法之外的任何其他通用方法也是受欢迎的。
提前致谢。
c# - BackgroundService 未关闭,stopToken 从未使用 .net 核心通用主机设置
我在 .net 通用主机中托管了一个 BackgroundService,如下所示:
然后我有我的工人:
在正在运行的应用程序的 Windows 终端上的 ctrl+c 上它说Application is shutting down
(这是来自框架)但是停止令牌永远不会被设置(所以我不能关闭我的工作人员)。
stopToken 如何以及何时设置,我如何优雅地终止我的工作人员?
控制台
c# - 在现有的网络核心应用程序中使用托管服务
我想为上传文件队列做后台作业。目前我的网络核心应用程序具有以下结构:-API -Entities -Repositories -Services
并且想知道如果我希望它在我的应用程序中运行,我是否必须创建这个工作服务?或者我可以添加新的服务HostedService
,然后在我的 API 的启动类中添加
services.AddHostedService<HostedService>()
就可以了吗?很抱歉这个菜鸟问题,但我没有找到很多例子,所以如果你有任何好的资源,我也会很感激。
c# - 处理队列元素网络核心API
我使用https://docs.microsoft.com/en-us/aspnet/core/fundamentals/host/hosted-services?view=aspnetcore-2.1&tabs=visual-studio作为创建后台服务和进程队列的参考。
我有来自 HTTP 请求的 csvfile 的 ImportService.cs 类,然后我想将它添加到队列中,该队列处理该 CSV 文件并将结果写入数据库。这是我有IBackgroundTaskQueue
实例的服务类
}
下面我将添加从 microsoft 示例创建的类:
我的问题是该文件应该在哪里处理?在ImportService
? 还是在QueuedHostedService
?如果QueuedHostedService
我应该如何传递和访问该文件?什么是最好的做法?我想创建处理该文件的DoWork()
函数,QueuedHostedService
但我不确定如何
c# - 响应完成后在后台任务中使用 HttpContext
用户可以通过向 ASP.NET Core 控制器发送请求来触发长时间运行的作业。当前,控制器执行作业,然后发送 200 OK 响应。问题是客户端必须等待相当长的时间才能得到响应。
这就是为什么我目前正在尝试在后台任务中处理该作业。我正在使用IBackgroundTaskQueue
存储所有作业的位置,以及IHostedService
每当有新作业入队时处理作业的位置。它类似于Microsoft 文档中的代码。
但该作业确实需要访问数据库,因此用户必须使用 Active Directory 进行身份验证。因此,我需要访问HttpContext.User
后台任务中的属性。不幸的是,在HttpContext
发送响应时以及在作业处理开始之前,它就被处理掉了。
示范
控制器将新作业排入任务队列。
为它出列的每个作业IHostedService
创建一个新的。JobRunner
我在IServiceScopeFactory
这里使用一个可用的依赖注入。JobRunner
在实际代码中也有更多的依赖关系。
现在,在发送请求时,由于为空,所以NullReferenceException
会抛出a。JobRunner.Run()
httpContextAccessor.HttpContext
我试过的
我还没有一个好主意如何解决这个问题。我知道可以从 复制必要的信息HttpContext
,但不知道如何使它们可用于依赖注入服务。
我想也许我可以创建一个IServiceProvider
使用旧服务的新服务,但替换 的实现IHttpContextAccesor
,但这似乎是不可能的。
HttpContext
尽管响应已经完成,如何在后台任务中使用?
c# - 在 Configure() 之后启动 IHostedService
我有一个 .NET Core 3.1 应用程序,它提供一个描述应用程序运行状况的端点,以及一个 IHostedService 处理数据库中的数据。但是有一个问题,HostedService的worker函数开始处理很长时间,导致Startup中的Configure()
方法没有被调用,/status
端点也没有运行。
我希望/status
端点在 HostedService 启动之前开始运行。如何在托管服务之前启动端点?
示例代码
托管服务
我试图探索在 中添加 HostedService Configure()
,但app.ApplicationServices
它是一个 ServiceProvider,因此是只读的。
entity-framework - .netcore3 / EF / HostedService:数据仅在第二次运行时被删除
我每分钟都在运行一个托管服务。该服务将数据存储在缓存中的表中,然后使用数据并发送邮件。然后它删除记录。我必须这样做,因为如果发送邮件失败,我可以用相同的记录重试。
所以服务从缓存中获取数据。将其存储在表中。它从表中获取数据并发送邮件。成功时,它会从表中删除记录。但是,一分钟后,邮件被第二次发送了。如此接缝,记录不会第一次被删除。
我正在做这样的事情(缩短代码):
请给我一个提示,我可以如何改进我的代码,或者可能是什么原因。
更新 02.06.2020
我发现使用分离的范围时一切都像预期的那样工作。
在同一范围内创建和直接删除数据可能是问题吗?
谢谢!