如何在ASP.NET Web中运行后台任务.Api?

时间:2015-05-15 06:09:03

标签: c# asp.net asp.net-web-api background hangfire

我正在使用C#和.NET Framework 4.5.1开发ASP.NET MVC Web Api 2应用程序。

有时,当用户在ApiController上调用get时,我必须在后台运行任务。该任务将填充包含更多数据的数据库表。

在互联网上搜索我发现了这篇文章How to run Background Tasks in ASP.NET。我想使用HangFire。但是阅读它的文档我没有找到一种方法来使用它而不在我的ASP.NET Web Api应用程序上使用OWIN(我现在没有使用它)。

有没有办法在没有OWIN的情况下使用Hangfire?或者,是否有另一种选择在ASP.NET Web Api 2应用程序上运行后台任务?

2 个答案:

答案 0 :(得分:5)

我不太确定你是否仍然需要这个(我对此表示怀疑)但我只是回答这个问题,因为它在谷歌搜索上排名很高。那么,使用OWIN启动Hangfire服务器的传统方法如下......

public void Configuration(IAppBuilder app){
    app.UseHangfireServer();
}

服务器生命周期

但是,基于文档...... Hangfire根本不依赖于OWIN,您需要做的就是启动和停止BackgroundJobServer

(来源)http://docs.hangfire.io/en/latest/background-processing/processing-background-jobs.html

  

Hangfire Server部分负责后台作业处理。服务器不依赖于ASP.NET,可以从控制台应用程序到Microsoft Azure Worker Role在任何地方启动。所有应用程序的单个API都通过BackgroundJobServer类公开

这意味着您将在应用程序启动时启动服务器...

var server = new BackgroundJobServer();

你会在申请结束时处理它......

server.Dispose();

这正是app.UseHangfireServer();所做的。参见源代码......

https://github.com/HangfireIO/Hangfire/blob/master/src/Hangfire.Core/AppBuilderExtensions.cs#L293

https://github.com/HangfireIO/Hangfire/blob/master/src/Hangfire.Core/AppBuilderExtensions.cs#L311

使用global.asax ..

查看下面的示例
    BackgroundJobServer _server;

    protected void Application_Start(object sender, EventArgs e)
    {
        GlobalConfiguration.Configuration
            .UseSqlServerStorage("YOUR_CONNECTION_STRING");

        _server = new BackgroundJobServer();
    }

    protected void Application_End(object sender, EventArgs e)
    {
        _server.Dispose();
    }

SQL Server存储

要注册您不需要OWIN的SQL Server存储,这就是您需要做的所有事情......

Hangfire.GlobalConfiguration.Configuration.UseSqlServerStorage("YOUR_CONNECTION_STRING");

再一次,我通过查看源代码来得出这个结论......

https://github.com/HangfireIO/Hangfire/blob/master/src/Hangfire.SqlServer/SqlServerStorageExtensions.cs

结论

Hangfire并不依赖于OWIN而且他们已经承认

答案 1 :(得分:0)

您可以使用ThreadPool.QueueUserWorkItem委派您的流程,它将由CLR使用线程进行管理。