在ASP.NET Web API項目中使用Hangfire實現背景工作處理

來源:互聯網
上載者:User

標籤:

當前項目中有這樣一個需求:由前端使用者的一個操作,需要觸發到不同裝置的訊息推送。由於推送這個具體功能,我們採用了第三方的服務。而這個服務調用有時候可能會有延時,為此,我們希望將訊息推送與使用者前端操作實現非同步執行,就是希望在後台自動執行,不阻塞前端使用者的操作,而且最好能實現失敗重試等功能。

經過一些研究比較,我們發現使用Hangfire這個組件可以較好地實現這個需求。為了給大家做一個示範,我這裡簡化了代碼,做一個範常式序。

我在這裡不準備詳細介紹Hangfire的基本用法,有興趣的同學們可以參考官方網站 http://hangfire.io/  和文檔 http://docs.hangfire.io/en/latest/ 

 

第一步:建立ASP.NET Web API項目

 

第二步:安裝必要的nuget package

開啟Nuget Package Manager Console

首先安裝Hangfire組件(Core,MemoryStorage),注意,因為後者是依賴前者的,所以我們只需要運行下面的命令即可

Install-Package Hangfire.MemoryStorage

Storage就是儲存的意思,Hangfire的背景工作是需要一個地方儲存起來,它預設支援SQL Server Storage和MemoryStorage。採用MemoryStorage無疑是最簡單的(不需要有任何外部的依賴)。當然,最大的問題就是,因為是放在記憶體中的,萬一網站出現問題重啟,那麼沒有執行完的任務是會消失的。

如果要使用SQL Server的話,可以參考 http://docs.hangfire.io/en/latest/configuration/using-sql-server.html ,甚至還可以結合MSMQ來提高可用性 http://docs.hangfire.io/en/latest/configuration/using-sql-server-with-msmq.html 

 

接下來為當前項目啟用Owin的支援。關於什麼是OWin,我這裡也不準備多做說明,有興趣的同學可以參考 : http://www.cnblogs.com/dudu/p/what-is-owin.html  和 http://owin.org/ 還有 http://www.asp.net/aspnet/overview/owin-and-katana/an-overview-of-project-katana 

Install-Package Microsoft.Owin.Host.SystemWeb

 

第三步:添加Owin Startup Class

修改Startup.cs為下面這樣的代碼

using Hangfire;using Hangfire.MemoryStorage;using Microsoft.Owin;using Owin;[assembly: OwinStartup(typeof(WebApplicationWebApiHangfireSample.Startup))]namespace WebApplicationWebApiHangfireSample{    /// <summary>    /// 示範Hangfire的配置    /// 陳希章    /// </summary>    public class Startup    {        public void Configuration(IAppBuilder app)        {            // For more information on how to configure your application, visit http://go.microsoft.com/fwlink/?LinkID=316888            //指定Hangfire使用記憶體儲存背景工作資訊            GlobalConfiguration.Configuration.UseMemoryStorage();            //啟用HangfireServer這個中介軟體(它會自動釋放)            app.UseHangfireServer();            //啟用Hangfire的儀錶盤(可以看到任務的狀態,進度等資訊)            app.UseHangfireDashboard();        }    }}

 

 

第四步:實現一個簡單的Web API,啟動背景工作

using Hangfire;using System;using System.Diagnostics;using System.Web.Http;namespace WebApplicationWebApiHangfireSample.Controllers{    /// <summary>    /// 用來公開給前端使用者調用的API    /// 陳希章    /// </summary>    public class MessageController : ApiController    {        /// <summary>        /// 這個是用來發送訊息的靜態方法        /// </summary>        /// <param name="message"></param>        public static void Send(string message)        {            EventLog.WriteEntry("EventSystem", string.Format("這是由Hangfire背景工作發送的訊息:{0},時間為:{1}", message, DateTime.Now));        }        public IHttpActionResult Post(string content)        {            //這裡可以做一些業務判斷或操作                        //然後需要推送的時候,調用下面的方法即可            BackgroundJob.Enqueue(() => Send(content));                      //最後返回(這裡是立即返回,不會阻塞)            return Ok();        }    }}

 

第五步:進行測試

我使用Fiddler來類比用戶端調用

我們可以很容易地發起大量的請求,例如下面這樣

很快就在Dashboard中看到任務狀態(有1000個任務)

但是很快(不到1秒鐘的時間),這些任務就全部處理完了

 

我們可以在Windows事件記錄中看到訊息

以上就是我的簡單示範例子。當然,如果還想要實現失敗重試,或者更加有意思的一些功能(例如定時發送),可以繼續參考官方文檔。

這個範例代碼可以通過這裡下載  http://files.cnblogs.com/files/chenxizhang/WebApplicationWebApiHangfireSample.zip

在ASP.NET Web API項目中使用Hangfire實現背景工作處理

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.