0

我正在开发一个 asp.net mvc5 Web 应用程序,并且我安装了 Hangfire:-

Install-Package Hangfire

之后,我创建了一个 startup.css 类,如下所示:-

public class Startup
{
   public void Configuration(IAppBuilder app)
   {

   }
}

然后在我的 global.asax 文件中,我尝试调用 2 个操作方法;Index ()& ScanServer(),如下:-

 HomeController h = new HomeController();
        protected void Application_Start()
        {
            AreaRegistration.RegisterAllAreas();
            RouteConfig.RegisterRoutes(RouteTable.Routes);


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

&

 RecurringJob.AddOrUpdate(() =>  h.ScanServer(*****), Cron.Minutely);

现在,当 Hangfire 尝试调用具有以下定义的 Index() 操作方法时:-

 public ActionResult Index()

我收到了这个错误:-

JobStorage.Current 属性值尚未初始化。您必须在使用 Hangfire 客户端或服务器 API 之前设置它。

而当 Hangfire 尝试调用 ScanServer() 操作方法时,它是一个异步任务,具有以下定义:-

 public async Task<ActionResult> ScanServer(string tokenfrom)

我收到了这个错误:-

不支持异步方法。请在后台使用它们之前使它们同步。

那么任何人都可以建议如何解决这两个问题吗?

谢谢

编辑

我在 Startup 类中写了以下内容:-

using Hangfire;
using Microsoft.Owin;
using Owin;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using ScanningFinal;
[assembly: OwinStartup(typeof(Startup))]
namespace ScanningFinal
{

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

&这里是连接字符串:-

 <add name="scanservice"    connectionString="data source=localhost;initial catalog=ScanningService;integrated security=True" providerName="System.Data.SqlClient"/>

但我仍然收到此错误:-

JobStorage.Current 属性值尚未初始化。您必须在使用 Hangfire 客户端或服务器 API 之前设置它。

4

1 回答 1

3

您需要在配置方法中配置 Hangfire。

[assembly: OwinStartup(typeof(YourApp.Startup))] // Change YourApp to your base namespace
public partial class Startup
{
    public void Configuration(IAppBuilder app)
    {
        app.UseHangfire(config => 
        {
            config.UseSqlServerStorage("NameOfConnectionStringKey"); // Other storage options are available
            config.UseDashboardPath("/hangfire");
            config.UseServer();
        });
    }
}

基本上,您的第一个问题是您尚未将 Hangfire 配置为使用数据库。通过上述解决方案,我告诉hangfire 使用SqlServer 作为作业存储,将web.config 中定义的connectionString 键传递给它。如果您不想使用 SQL Server,那么您可以使用其他存储选项——我在我的项目中使用 MongoDB 取得了成功。

然后,我还将设置仪表板的路径,以便您可以在浏览器中访问漂亮的 UI。

你也可以在这里提供你选择的依赖注入。

至于您的第二个问题,您能否将服务方法从异步更改为同步方法?

于 2015-09-10T15:47:43.780 回答