没有活动服务器。后台任务将不会被处理

时间:2015-12-11 07:58:22

标签: c# hangfire

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

我在C#网络应用日志中发现了这个例外。

  

[2015-12-03 13:56:06] [ERROR] [] [执行期间发生错误   ' Server Bootstrapper'零件。执行将被重试(尝试   120 of 2147483647)在00:05:00秒。]   [System.Data.SqlClient.SqlException(0x80131904):登录失败   用户"网络帐户"。

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

但是,当我转到Hangfire仪表板时,我可以看到定期作业,在我看来,hangfire可以使用正确的帐户访问数据库以检索定期作业。

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

我是否知道有人遇到类似的问题并且有解决方案。真的很感谢你的帮助!!

3 个答案:

答案 0 :(得分:0)

我使用Hangfire与SQL Server和EntityFramework Code First遇到了同样的问题,其中EntityFramework负责创建数据库,所以这个建议完全基于这种情况。

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

这意味着在App Start中您的数据库可能不存在。 Hangfire不会创建数据库,只会在现有数据库中创建表。

所以你可能会看到的是:

  1. 没有数据库。
  2. 你的应用程序启动并且Hangfire尝试让自己运行,服务器进程抛出错误,因为EF尚未创建数据库。
  3. Web应用程序启动完成,因为hangfire服务崩溃对应用程序来说并不致命。
  4. 您的网络应用中的某些内容会调用EntityFramework。
  5. EF运行并创建数据库(此时可能没有hangfire表)
  6. 您访问hangfire仪表板,hangfire现在可以连接,并且看到表不存在,因此它创建它们。 (现在您将看到数据库中的表格)
  7. 仪表板现在可以看到数据库并显示统计信息(可能是0台服务器正在运行),所以看起来一切正常。
  8. 我解决它的方法是确保即使数据库为空(不是表),也至少会创建它。这是hangfire可以访问它来安装它的表并启动,EF可以访问它,并创建它的架构。

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

    希望有所帮助!

    史蒂夫

答案 1 :(得分:0)

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

答案 2 :(得分:0)

在我的例子中,服务器名称太长,并且有一个 SQL 错误说它会被截断。我只能在 Visual Studio 中关闭 Just My Code 的情况下启动它后才能看到此错误。

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