问题标签 [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.

0 投票
1 回答
2430 浏览

c# - IHostedService 可用于 Azure Functions 应用程序吗?

不管我们是否应该,我们可以IHostedService在 Azure Functions App 中使用吗?

这是尝试将托管服务(特别是后台服务)注册为IHostedService

然后,函数应用程序会引发以下异常:

0 投票
1 回答
385 浏览

c# - 托管服务中数据库上下文的并发问题

我有一个托管服务,它通过 API 端点处理对象 PUT/POST,也就是说,一旦给出新实体或编辑现有实体,(a)托管服务开始处理它(一个长时间运行的过程), (b) 接收/修改的对象(作为 JSON 对象)返回给 API 调用者。

当 PUT/POST 一个实体时,我在这里和那里看到运行时错误(例如,在对象 JSON 序列化程序中)抱怨不同的问题,例如:

ObjectDisposedException:无法访问已处置的对象。此错误的一个常见原因是释放从依赖注入中解析的上下文,然后尝试在应用程序的其他地方使用相同的上下文实例。如果您在上下文上调用 Dispose() 或将上下文包装在 using 语句中,则可能会发生这种情况。如果你使用依赖注入,你应该让依赖注入容器负责处理上下文实例。

或者:

InvalidOperationException:在前一个操作完成之前在此上下文上启动了第二个操作。这通常是由使用相同 DbContext 实例的不同线程引起的。

最初我使用的是数据库上下文池,但据此,似乎池在托管服务方面存在已知问题。因此,我切换到了常规AddDbContext;但是,这都没有解决问题。

这就是我定义数据库上下文和托管服务的方式:

并且我按以下方式访问托管服务中的数据库上下文(如此处推荐):

编辑 1

如前所述,错误发生在代码周围。但是,由于我提到了序列化程序上发生的错误,因此我将在以下内容中共享序列化程序代码:

更新 2

示例 API 端点如下所示:

0 投票
2 回答
5216 浏览

c# - 如何为控制台应用程序设置 ASPNETCORE_ENVIRONMENT?

我有以下包含托管服务的简单控制台应用程序:

它适用于我的数据库,这意味着它需要连接字符串。我有三个appsettings.json文件:

在此处输入图像描述

在开发服务器上,我将使用Development环境,在生产服务器上 - Production. 在我的本地机器上,我将使用Local. 这很简单。我将在ASPNETCORE_ENVIRONMENT(OS 环境变量)的帮助下得到它。

我使用 Linux,在我的 shell (zsh) 配置文件中我有:

在此处输入图像描述

当我输入我的终端时,$ echo $ASPNETCORE_ENVIRONMENT我有Local. 但是当我启动我的控制台应用程序时

它试图从Production环境开始。查看调试输出:

在此处输入图像描述

那么如何设置环境呢?为什么 Os 变量不起作用?

0 投票
1 回答
544 浏览

.net-core - 在 .NET Core Worker 服务中根据配置注册托管服务

在 .NET core 3+ 工作服务中,我们可以使用CreateHostBuilder方法下的 ConfigureServices 注册多个工作服务,如下所示

有没有办法根据配置设置(例如appsettings.json)添加这些服务(TestWorker1,TestWorker2),以便只注册配置文件中定义的服务。

除了配置文件方法之外的任何其他通用方法也是受欢迎的。

提前致谢。

0 投票
1 回答
2086 浏览

c# - BackgroundService 未关闭,stopToken 从未使用 .net 核心通用主机设置

我在 .net 通用主机中托管了一个 BackgroundService,如下所示:

然后我有我的工人:

在正在运行的应用程序的 Windows 终端上的 ctrl+c 上它说Application is shutting down(这是来自框架)但是停止令牌永远不会被设置(所以我不能关闭我的工作人员)。

stopToken 如何以及何时设置,我如何优雅地终止我的工作人员?

控制台

0 投票
1 回答
104 浏览

c# - 在现有的网络核心应用程序中使用托管服务

我想为上传文件队列做后台作业。目前我的网络核心应用程序具有以下结构:-API -Entities -Repositories -Services

我在这里看这个例子:https ://docs.microsoft.com/en-us/aspnet/core/fundamentals/host/hosted-services?view=aspnetcore-3.1&tabs=visual-studio

并且想知道如果我希望它在我的应用程序中运行,我是否必须创建这个工作服务?或者我可以添加新的服务HostedService,然后在我的 API 的启动类中添加 services.AddHostedService<HostedService>()就可以了吗?很抱歉这个菜鸟问题,但我没有找到很多例子,所以如果你有任何好的资源,我也会很感激。

0 投票
0 回答
182 浏览

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但我不确定如何

0 投票
0 回答
1323 浏览

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尽管响应已经完成,如何在后台任务中使用?

0 投票
4 回答
3994 浏览

c# - 在 Configure() 之后启动 IHostedService

我有一个 .NET Core 3.1 应用程序,它提供一个描述应用程序运行状况的端点,以及一个 IHostedService 处理数据库中的数据。但是有一个问题,HostedService的worker函数开始处理很长时间,导致Star​​tup中的Configure()方法没有被调用,/status端点也没有运行。

我希望/status端点在 HostedService 启动之前开始运行。如何在托管服务之前启动端点?

示例代码

托管服务

我试图探索在 中添加 HostedService Configure(),但app.ApplicationServices它是一个 ServiceProvider,因此是只读的。

0 投票
0 回答
26 浏览

entity-framework - .netcore3 / EF / HostedService:数据仅在第二次运行时被删除

我每分钟都在运行一个托管服务。该服务将数据存储在缓存中的表中,然后使用数据并发送邮件。然后它删除记录。我必须这样做,因为如果发送邮件失败,我可以用相同的记录重试。

所以服务从缓存中获取数据。将其存储在表中。它从表中获取数据并发送邮件。成功时,它会从表中删除记录。但是,一分钟后,邮件被第二次发送了。如此接缝,记录不会第一次被删除。

我正在做这样的事情(缩短代码):

请给我一个提示,我可以如何改进我的代码,或者可能是什么原因。

更新 02.06.2020

我发现使用分离的范围时一切都像预期的那样工作。

在同一范围内创建和直接删除数据可能是问题吗?

谢谢!