没有活动服务器.不会处理后台任务

本文关键字:处理 后台任务 服务器 活动 | 更新日期: 2023-09-27 18:26:27

我有一个问题,我已经研究了几天,但仍然没有解决方案。

我在C#web应用程序日志中发现了此异常。

〔2015-12-03 13:56:06〕〔错误〕〔〕〔在执行"服务器引导程序"组件。将重试执行(尝试2147483647中的120)。][System.Data.SqlClient.SqlException(0x80131904):的登录失败用户"网络帐户"。

在我看来,它正在使用网络帐户访问SQL数据库,因为该网络帐户未被授予访问数据库的权限,因此登录失败,服务器无法启动。

然而,当我进入Hangfire面板时,我可以看到重复的作业,在我看来,Hangfire可以使用正确的帐户访问数据库来检索重复的作业。

此外,在IIS服务器中,我们已经将应用程序池的Identity设置为"ApplicationPoolIdentity"。因此,我们应该使用虚拟帐户而不是网络帐户。

我可以知道有谁有类似的问题并有解决方案吗。真的很感谢你的帮助!!

没有活动服务器.不会处理后台任务

我在使用Hangfire with SQL Server和EntityFramework Code First时遇到了同样的问题,EntityFramework负责创建数据库,所以这个建议完全基于该场景。

如果您使用的是EF Code First,则在第一次创建和访问上下文之前,不会创建数据库。

这意味着在应用程序启动时,您的数据库可能不存在。Hangfire不会创建数据库,它只会在现有数据库中创建表。

所以你可能看到的是:

  1. 不存在数据库
  2. 你的应用程序启动了,Hangfire试图让自己运行,服务器进程抛出了一个错误,因为EF还没有创建DB
  3. web应用程序启动完成,因为hangfire服务崩溃对应用程序来说并不是致命的
  4. 您的web应用程序中的某些内容调用了EntityFramework
  5. EF运行并创建数据库(此时可能没有挂起的表)
  6. 当您访问hangfire面板时,hangfire现在可以连接,并看到这些表不存在,所以它创建了它们。(现在您将看到数据库中的表)
  7. 仪表板现在可以看到数据库并向您显示统计数据(可能有0台服务器正在运行),所以看起来一切都在工作

我解决这个问题的方法是确保即使数据库是空的(而不是表),它也至少是创建的。这就是hangfire可以访问它来安装它的表并启动,EF可以访问它并创建它的模式。

此外,(可能不是这样)GlobalConfiguration.Configuration.UseSqlServerStorage()应该在其他Hangfire启动配置之前先运行。

希望能有所帮助!

Steve

您应该创建后台作业服务器实例,请参阅此处的文档

在我的例子中,服务器名称太长,并且出现SQL错误,表示它将被截断。只有在Visual Studio中关闭了Just My Code后,我才能看到此错误。

这个故事的寓意是:为服务器使用一个较短的名称,并且不要在其上附加您自己的每个实例唯一标识符,这样它就不会遇到截断错误。该列是nvarchar(100)