【问题标题】:hangfire is not running when i deploy my asp.net mvc-5 web application on iis 7.5当我在 iis 7.5 上部署我的 asp.net mvc-5 Web 应用程序时,hangfire 没有运行
【发布时间】:2015-09-17 01:31:22
【问题描述】:

我正在开发一个 asp.net mvc-5 Web 应用程序。我使用 nuget 工具在我的 Web 应用程序中安装了 hangfire 工具。

https://www.nuget.org/packages/Hangfire/

然后我创建以下startup.cs 类,每分钟调用一个方法如下:-

 public class Startup
    {
        public void Configuration(IAppBuilder app)
        {
            GlobalConfiguration.Configuration
                .UseSqlServerStorage("scanservice");


            ScanningService ss = new ScanningService();
            RecurringJob.AddOrUpdate(() => ss.HypervisorScan("allscan"), Cron.Minutely);

        }

    }

这里是要调用的方法的定义:-

public async Task<ScanResult> HypervisorScan(string FQDN)
{

但目前我在 IIS 7.5 上部署我的应用程序,并且根本没有调用该方法。那么有人可以对此提出建议吗?

谢谢

【问题讨论】:

  • 如果你在 Startup 类中设置断点,它会到达吗?如果您添加 Hangfire 仪表板 (app.UseHangfireDashboard();),然后访问 ~/hangfire URL,您看到那里的工作了吗?您的 Startup 类中有 OwinStartupAttribute ([assembly: OwinStartup(typeof(MyWebApplication.Startup))]) 吗?
  • @mason 为什么我需要添加 OwinStartupAttribute ?我没有收到任何错误,或者即使 VS 没有引发任何错误,这也是必须添加的?
  • 添加引用后,我收到以下异常“不支持异步方法。请在后台使用它们之前使它们同步。” ,,这可能与我调用的方法是异步的有关吗?

标签: asp.net asp.net-mvc owin hangfire


【解决方案1】:

您的班级缺少 OwinStartupAttribute。添加它。这会告诉 OWIN 代码在启动时在哪里运行。

另外,you can't run async methods directly in Hangfire 错误明确指出。因此,使用 Wait 调用包装该方法并将其传递给 Hangfire。

最后,您应该坚持 Async 方法应以 Async 后缀结尾的约定。将ScanningService.HypervisorScan 重命名为ScanningService.HypervisorScanAsync

[assembly: OwinStartup(typeof(MyWebApplication.Startup))]
namespace MyWebApplication
{
    public class Startup
    {
        public void Configuration(IAppBuilder app)
        {
            GlobalConfiguration.Configuration
                .UseSqlServerStorage("scanservice");    


            RecurringJob.AddOrUpdate(() => HypervisorScan(), Cron.Minutely);
        }

       public void HypervisorScan()
       {
           ScanningService ss = new ScanningService();
           ss.HypervisorScanAsync("allscan").Wait();
       }
    }
}

【讨论】:

  • 但是最后使用 .Wait() 会占用线程,因为它是阻塞操作。所以不建议使用 .Wait() ,因为它是阻塞方法,不像使用 await 那样是 100% 异步 .. 所以如果我使用 hangfire 我将不得不打破我的方法的异步行为。谢谢
  • @johnG Hangfire 不需要 异步方法,因为根据其定义,它异步运行。当您AddOrUpdate 一个作业时,它会从 lambda 获取方法调用并将其添加到它的计划作业列表中。所以这是异步的,只是不需要使用 C# 的异步概念。
  • 但问题在于这个“ss.HypervisorScanAsync("allscan").Wait();"因为这样使用wait()意味着iis线程会一直被占用到操作结束,,,
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-02-14
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多