问题标签 [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 回答
12892 浏览

c# - 如何为我的后台服务编写单元测试?

我正在使用 .NET Core 中的 HostBuilder(不是 WebHost !)。

我的应用程序中运行了一个托管服务,它覆盖了后台服务的 ExecuteAsync/StopAsync 方法,我想对其进行单元测试。

这是我的托管服务:

我已经找到了这篇文章:.NET Core 中托管服务的集成测试

但它是为 QueuedBackgroundService 解释的,我真的不知道我是否可以以同样的方式测试我的。

我只想知道我的代码是否被执行。我不想要任何具体的结果。你知道我如何测试它吗?

0 投票
1 回答
2397 浏览

c# - 同时启动多个长时间运行的后台服务

我正在尝试IHostedServicedotnet core 2.2. 我的任务是创建 2 个后台长时间运行的任务。

  • 其中第一个是管理Selenium浏览器会话(打开/关闭选项卡,解析 DOM)并将电子邮件消息放入ConcurrentBag.
  • 第二个后台工作人员每 10 分钟发送一次电子邮件通知,针对存在的消息ConcurrentBag(第一个任务添加)。它还将它们分组在一起,以便只发送一条消息。

但是,我在同时运行 2 个托管进程时遇到了麻烦。如果执行,似乎只有第一个托管进程,而第二个进程等待第一个进程完全执行。但是因为我从没想过它会完成 - 第二个过程永远不会开始......

我在滥用IHostedService吗?如果是,那么完成我的任务的最佳架构方法是什么?

这是我目前正在使用的代码(试图完成):

BrowserWorkerHostedService

EmailWorkerHostedService

编辑:应用答案中建议的更改后,这是当前有效的代码版本。添加await帮助。

0 投票
1 回答
443 浏览

c# - Task.Delay() 触发应用程序生命周期的取消

我遇到了一种情况,即Task.Delay()方法会在IApplicationLifetime. 这是代码:

以下是异常停止的托管服务:

我希望我的服务能够运行,除非lifetime.StopApplication()被触发。但是,托管服务已停止,因为lifetime.ApplicationStarted.IsCancellationRequested变量true在第二次迭代时设置为。尽管理论上,我没有明确中止应用程序的代码。

日志将如下所示:

启动 BrowserWorkerHostedService 正在工作。09.07.2019 17:03:53

EmailWorkerHostedService 正在工作。09.07.2019 17:03:53

申请开始。按 Ctrl+C 关闭。

托管环境:生产

内容根路径:xxxx

结束 EmailWorkerHostedService

结束 BrowserWorkerHostedService

有没有很好的解释为什么Task.Delay()触发 ApplicationStarted 取消事件?

0 投票
1 回答
578 浏览

asp.net-core - 如何从 ASP.NET Core 中的 IHostedService 获取网站 URL 或访问 HttpContext?

在我们的 MultiTenant ASP.NET Core 2.2 应用程序中,我们根据 URI 确定租户。

如何从 IHostedService 获取网站 URL?HttpContext 始终为空。

IHttpContextAccessor.HttpContext 始终为 NULL

即使在 Scope 中运行 IHostedService 也会为 httpContextAccessor.HttpContext 返回 NULL,即通过 Scoped Service 注入它也不起作用。

有没有其他方法可以从 IHostedService 获取网站的 URL?

0 投票
1 回答
2100 浏览

.net-core - 从 BackgroundService 启动服务总线客户端

我有一个ServiceBusClient类,它创建一个QueueClient用于在公共汽车上收听消息的类。我查看了以下文章来进行设置:

后台任务(微软)

托管服务(微软)

异步和等待

我的ServiceBusClient类处理QueueClient看起来像这样:

我希望从一个IHostedService甚至通过扩展BackgroundService. 在我发现的示例中,工作不断在一个不适合我的场景的 while 循环中执行,因为我只尝试运行一个命令。

所以我创建了一个超级简单的实现,如下所示:

如果删除async我显然需要返回一些东西。我试过Task.CompletedTask了,但这需要我将返回类型更改为Task<Task>.

如果我有适当的async位置,我将需要await一些东西,但我不确定是什么。

这感觉不对。ServiceBusClient我认为我需要更改ProcessMessagesAsync.

我想要的只是让我的网络应用程序开始监听消息,直到它死掉。我怎样才能做到这一点?

0 投票
0 回答
297 浏览

c# - 如何在 .netcore 中对托管服务进行排队?

我有两个后台服务 A 和 B。服务 A 获取令牌并将其保存在运行服务 B 所需的缓存中。

我想知道,有什么办法可以强制先运行服务A,然后再运行服务B?

我已经研究了排队的后台任务,但我认为这不是我需要的。

0 投票
2 回答
3682 浏览

c# - 在 .NET Core 中对托管服务进行单元测试

我有一个由.NET Core 中的托管服务实现的后台任务。这个类的逻辑很少:

我的Startup样子:

如何对DoWork方法中的逻辑进行单元测试?问题是托管服务是由框架管理的,我不知道如何隔离这个类。

0 投票
1 回答
1242 浏览

.net - 未处理的异常:超时已过期。在从池中获取连接之前经过的超时时间

我在 .netcore 中托管了服务,它运行几个每秒执行 SQL 查询的函数。在运行应用程序一段时间它崩溃时,我知道它耗尽了所有连接池的问题并且我没有正确处理连接。我知道我需要打开和关闭连接。

dbcontext 未处理的异常:System.InvalidOperationException:超时已过期。在从池中获取连接之前超时时间已过。这可能是因为所有池连接都在使用中并且达到了最大池大小。

我面临的问题是我正在使用DBContext它自动获取并为我打开数据库连接,我不必明确告诉我打开连接,但是我该如何关闭连接?每个Scope

启动:

连接字符串:

更新:

数据库上下文:

0 投票
1 回答
2757 浏览

c# - .net core 2.2 windows服务完全启动后如何配置托管服务?

这是 Windows 服务行为示例,其中托管服务在应用程序启动之前尝试连接 我有一个 .net core 2.2 控制台应用程序配置为作为 Windows 服务运行。我还配置了一个托管服务,它尝试无限期地建立与外部 tcp 服务器的连接,直到连接成功。

问题是当 windows 服务启动并且外部 tcp 服务器不可用时,windows 服务在“启动”状态下挂起,直到外部服务可以连接。该服务永远不会达到“运行”状态。尽管此行为与文档https://docs.microsoft.com/en-us/aspnet/core/fundamentals/host/hosted-services?view=aspnetcore-2.2&tabs=visual-studio#ihostedservice-interface一致,其中说“使用通用主机时,在触发 ApplicationStarted之前调用 StartAsync 。”,我想要的是在 Windows 服务完全启动后(即处于“运行”状态)开始托管服务。

我确实研究了使托管服务成为定时后台服务的方面,其初始延迟足以完全启动 Windows 服务,而不是使用 IApplicationLifetime.ApplicationStarted 注册托管服务,但这感觉像是一种估计 Windows 所需时间的骇人听闻的方法服务开始。相反,我正在寻找一种在 Windows 服务完全启动后开始托管服务的优雅方式。

托管服务代码

该服务在 Program.cs 中注册为

0 投票
1 回答
1600 浏览

c# - 控制台应用程序后台服务中 httpclientfactory 的 DI

我有一个带有简单消费后台服务的控制台程序,该程序需要从使用 HttpClientFactory 的作用域服务调用函数来调用外部 API 并将结果返回给使用后台服务。

在在线查看几个示例以消除代码中所有可能的复杂性之后,我想要非常简单。

一旦我使用 HttpClientFactory 获得 scopedservice,我就会收到以下消息:

尝试激活“Integration.BackgroundService.Services.ScopedServices”时无法解析“System.Net.Http.IHttpClientFactory”类型的服务。