.NET之Hangfire快速入門和使用

<div class="postBody">javascript

<div id="cnblogs_post_body" class="blogpost-body "><a name="_labelTop"></a><div id="navCategory"><p style="font-size:18px"><b>目錄導航:</b></p><ul><li style="list-style-type:square"><a href="#_label0">前言:</a></li><li style="list-style-type:square"><a href="#_label1">1、Hangfire是什麼:</a></li><li style="list-style-type:square"><a href="#_label2">2、Hangfire使用條件:</a></li><li style="list-style-type:square"><a href="#_label3">3、Hangfire的基本特徵與優勢:</a></li><li style="list-style-type:square"><a href="#_label4">4、Hangfire安裝和使用:</a><ul><li style="list-style-type:decimal"><a href="#_label4_0">在NuGet上有關於Hangfire的 一系列軟件包:</a></li><li style="list-style-type:decimal"><a href="#_label4_1">經過在程序包管理控制檯中輸入安裝命令安裝Hangfire所需NuGet包:</a><ul><li style="list-style-type:lower-alpha"><a href="#_label4_1_0">使用MS SQL Server做爲存儲時咱們須要安裝的NuGet:</a></li><li style="list-style-type:lower-alpha"><a href="#_label4_1_1">使用MySQL做爲存儲時咱們須要安裝的NuGet:</a></li></ul></li><li style="list-style-type:decimal"><a href="#_label4_2">添加和配置OWIN Startup.cs,及其鏈接對應的存儲數據庫:</a><ul><li style="list-style-type:lower-alpha"><a href="#_label4_2_0">添加OWIN Startup.cs</a></li><li style="list-style-type:lower-alpha"><a href="#_label4_2_1">什麼是OWIN Startup.cs:</a></li><li style="list-style-type:lower-alpha"><a href="#_label4_2_2">在Startup.cs中鏈接須要使用的存儲庫:</a></li><li style="list-style-type:lower-alpha"><a href="#_label4_2_3">Web.config數據庫鏈接配置:</a></li></ul></li><li style="list-style-type:decimal"><a href="#_label4_3">運行程序,訪問調度控制面板:</a><ul><li style="list-style-type:lower-alpha"><a href="#_label4_3_0">運行成功,查看數據庫中是否生成了與Hangfire相關的表:</a></li><li style="list-style-type:lower-alpha"><a href="#_label4_3_1">&nbsp;訪問調度控制面板:</a></li></ul></li><li style="list-style-type:decimal"><a href="#_label4_4">&nbsp;後臺經常使用任務調度建立和使用:</a></li></ul></li><li style="list-style-type:square"><a href="#_label5">總結:</a></li><li style="list-style-type:square"><a href="#_label6">Hangfire相關使用學習資料:</a></li></ul></div><p>&nbsp;</p><p style="font-size:18px"><b>文章正文:</b></p> <div style="text-align: right"><a href="#_labelTop"><b style="font-family:Arial,Helvetica,sans-serif;">回到頂部</b></a><a name="_label0"></a></div><h2>前言:</h2> <p>  定時任務調度問題,是一個老生常談的問題。網上有許多定時任務調度的解決方案,對於我而言很早之前主要是使用Window計劃和Window服務來作任務定時執行,而後就開始使用定時任務調度框架Quartz.Net。可是卻一直沒有上手過Hangfire這個自帶後臺任務調度面板,能夠在後臺手動執行任務的神奇的任務調度框架。前段時間終於開始對他下手了,經過在網上查閱了一些資料和查看了Hangfire在Github中的demo,終於在我本身的項目中用上了Hangfire。在該篇文章中主要簡單介紹一下什麼是Hangfire,Hangfire的基本特徵與優勢和分別使用MySQL,MS SQL Server做爲存儲使用。</p> <div style="text-align: right"><a href="#_labelTop"><b style="font-family:Arial,Helvetica,sans-serif;">回到頂部</b></a><a name="_label1"></a></div><h2>1、Hangfire是什麼:</h2> <p>  Hangfire是一個開源的.NET任務調度框架,提供了內置集成化的控制檯,能夠直觀明瞭的查看做業調度狀況,而且Hangfire不須要依賴於單獨的應用程序執行(如:windows服務,window計劃)。而且支持持久性存儲。</p> <div style="text-align: right"><a href="#_labelTop"><b style="font-family:Arial,Helvetica,sans-serif;">回到頂部</b></a><a name="_label2"></a></div><h2>2、Hangfire使用條件:</h2> <blockquote> <p>Hangfire與特定的.NET應用程序類型無關。您能夠在ASP.NET Web應用程序,非ASP.NET Web應用程序,控制檯應用程序或Windows服務中使用它。如下是要求:</p> <p>1.NET Framework 4.5</p> <p>2.永久存儲(Hangfire將後臺做業和其餘與處理有關的信息保留在永久性存儲器中,因此須要存儲庫來存儲如:MS SQL Server,Redis,MySQL,PostgreSql等)</p> <p>3.Newtonsoft.Json庫≥5.0.1</p> </blockquote> <div style="text-align: right"><a href="#_labelTop"><b style="font-family:Arial,Helvetica,sans-serif;">回到頂部</b></a><a name="_label3"></a></div><h2>3、Hangfire的基本特徵與優勢:</h2> <p>經過官網中的一張圖片即可知道它是一個多麼優秀的任務調度框架,以下圖所示:</p> <p><img src="https://img2018.cnblogs.com/blog/1336199/201909/1336199-20190930003952822-502302129.png" alt=""></p> <p>&nbsp;</p> <p>&nbsp;</p> <div style="text-align: right"><a href="#_labelTop"><b style="font-family:Arial,Helvetica,sans-serif;">回到頂部</b></a><a name="_label4"></a></div><h2>4、Hangfire安裝和使用:</h2> <a name="_label4_0"></a><h3>在NuGet上有關於Hangfire的 一系列軟件包:</h3> <p><strong>詳情地址:</strong>&nbsp;<a href="https://www.nuget.org/packages?q=Hangfire">https://www.nuget.org/packages?q=Hangfire</a></p> <a name="_label4_1"></a><h3>經過在程序包管理控制檯中輸入安裝命令安裝Hangfire所需NuGet包:</h3> <a name="_label4_1_0"></a><h4><strong>使用MS SQL Server做爲存儲時咱們須要安裝的NuGet:</strong></h4> <p>&nbsp;在ASP.NET 應用程序下使用Hangfire安裝:&nbsp;</p> <div class="cnblogs_Highlighter sh-gutter"> <div><div id="highlighter_139601" class="syntaxhighlighter csharp"><div class="toolbar"><span><a href="#" class="toolbar_item command_help help">?</a></span></div><table border="0" cellpadding="0" cellspacing="0"><tbody><tr><td class="gutter"><div class="line number1 index0 alt2">1</div></td><td class="code"><div class="container"><div class="line number1 index0 alt2"><code class="csharp plain">Install-Package Hangfire</code></div></div></td></tr></tbody></table></div></div> </div> <p>在控制檯應用程序或者window server中處理做業:</p> <div class="cnblogs_Highlighter sh-gutter"> <div><div id="highlighter_501766" class="syntaxhighlighter csharp"><div class="toolbar"><span><a href="#" class="toolbar_item command_help help">?</a></span></div><table border="0" cellpadding="0" cellspacing="0"><tbody><tr><td class="gutter"><div class="line number1 index0 alt2">1</div><div class="line number2 index1 alt1">2</div></td><td class="code"><div class="container"><div class="line number1 index0 alt2"><code class="csharp plain">Install-Package Hangfire.Core</code></div><div class="line number2 index1 alt1"><code class="csharp plain">Install-Package Hangfire.SqlServer</code></div></div></td></tr></tbody></table></div></div> </div> <p><span style="color: #ff0000;"><strong>注意,在控制檯應用程序或者window server中不推薦直接安裝:Install-Package Hangfire ,由於它只是一個快速啓動軟件包,幷包含您可能不須要的依賴項(例如,Microsoft.Owin.Host.SystemWeb等無關依賴項)。</strong></span></p> <a name="_label4_1_1"></a><h4><strong>使用MySQL做爲存儲時咱們須要安裝的NuGet:</strong></h4> <p>&nbsp;在ASP.NET 應用程序下使用Hangfire安裝:&nbsp;</p> <div class="cnblogs_Highlighter sh-gutter"> <div><div id="highlighter_376796" class="syntaxhighlighter csharp"><div class="toolbar"><span><a href="#" class="toolbar_item command_help help">?</a></span></div><table border="0" cellpadding="0" cellspacing="0"><tbody><tr><td class="gutter"><div class="line number1 index0 alt2">1</div></td><td class="code"><div class="container"><div class="line number1 index0 alt2"><code class="csharp plain">Install-Package Hangfire.Core </code></div></div></td></tr></tbody></table></div></div> </div> <p>咱們還須要安裝一個MySql存儲(Hangfire.MySqlStorage)的拓展,注意由於Hangfire自己是不支持MySQL存儲的,這是名爲:<span style="font-family: 'Segoe UI', 'Helvetica Neue', Helvetica, Arial, sans-serif; font-size: 16px;">Arnoldas Gudas做者拓展的</span>:</p> <p>Nuget地址:<a href="https://www.nuget.org/packages/Hangfire.MySqlStorage/">https://www.nuget.org/packages/Hangfire.MySqlStorage/</a></p> <p>安裝命令:</p> <p><strong><span style="color: #ff0000;">注意:由於個人項目是.NET Framework,Version=v4.5.1版本的,因此只能安裝1.0.7版本的,你們看需求而定</span></strong></p> <div class="cnblogs_Highlighter sh-gutter"> <div><div id="highlighter_748161" class="syntaxhighlighter csharp"><div class="toolbar"><span><a href="#" class="toolbar_item command_help help">?</a></span></div><table border="0" cellpadding="0" cellspacing="0"><tbody><tr><td class="gutter"><div class="line number1 index0 alt2">1</div></td><td class="code"><div class="container"><div class="line number1 index0 alt2"><code class="csharp plain">Install-Package Hangfire.MySqlStorage -Version 1.0.7</code></div></div></td></tr></tbody></table></div></div> </div> <p>當咱們要使用(宿主)IIS託管ASP.NET應用程序時,咱們還須要安裝:</p> <div class="cnblogs_Highlighter sh-gutter"> <div><div id="highlighter_607813" class="syntaxhighlighter csharp"><div class="toolbar"><span><a href="#" class="toolbar_item command_help help">?</a></span></div><table border="0" cellpadding="0" cellspacing="0"><tbody><tr><td class="gutter"><div class="line number1 index0 alt2">1</div></td><td class="code"><div class="container"><div class="line number1 index0 alt2"><code class="csharp plain">Install-Package Microsoft.Owin.Host.SystemWeb -Version 4.0.1</code></div></div></td></tr></tbody></table></div></div> </div> <p>&nbsp;</p> <a name="_label4_2"></a><h3>添加和配置OWIN Startup.cs,及其鏈接對應的存儲數據庫:</h3> <a name="_label4_2_0"></a><h4>添加OWIN Startup.cs</h4> <p>  這裏是當你的項目中不存在Startup.cs時才須要執行添加的操做!</p> <p><img src="https://img2018.cnblogs.com/blog/1336199/201909/1336199-20190930012558086-1777119302.png" alt=""></p> <a name="_label4_2_1"></a><h4><span style="font-size: 1em;">什麼是OWIN Startup.cs:</span></h4> <p>簡單概述:是.NET 平臺開放的web接口,Startup則是.Net與web通信管道,起到轉發,溝通的做用。</p> <p>詳情介紹:<a href="https://www.cnblogs.com/wj033/p/6065145.html">https://www.cnblogs.com/wj033/p/6065145.html</a></p> <a name="_label4_2_2"></a><h4>在Startup.cs中鏈接須要使用的存儲庫:</h4> <div class="cnblogs_Highlighter sh-gutter"> <div><div id="highlighter_935176" class="syntaxhighlighter csharp"><div class="toolbar"><span><a href="#" class="toolbar_item command_help help">?</a></span></div><table border="0" cellpadding="0" cellspacing="0"><tbody><tr><td class="gutter"><div class="line number1 index0 alt2">1</div><div class="line number2 index1 alt1">2</div><div class="line number3 index2 alt2">3</div><div class="line number4 index3 alt1">4</div><div class="line number5 index4 alt2">5</div><div class="line number6 index5 alt1">6</div><div class="line number7 index6 alt2">7</div><div class="line number8 index7 alt1">8</div><div class="line number9 index8 alt2">9</div><div class="line number10 index9 alt1">10</div><div class="line number11 index10 alt2">11</div><div class="line number12 index11 alt1">12</div><div class="line number13 index12 alt2">13</div></td><td class="code"><div class="container"><div class="line number1 index0 alt2"><code class="csharp keyword">public</code> <code class="csharp keyword">void</code> <code class="csharp plain">Configuration(IAppBuilder app)</code></div><div class="line number2 index1 alt1"><code class="csharp plain">{</code></div><div class="line number3 index2 alt2"><code class="csharp spaces">&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="csharp comments">//運用SqlServer存儲,對應web.config中的connectionStrings中的name</code></div><div class="line number4 index3 alt1"><code class="csharp spaces">&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="csharp plain">GlobalConfiguration.Configuration.UseSqlServerStorage(</code><code class="csharp string">"sqlserver_connection"</code><code class="csharp plain">);&lt;br&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </code></div><div class="line number5 index4 alt2">&nbsp;</div><div class="line number6 index5 alt1"><code class="csharp spaces">&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="csharp comments">//注意,當你使用的是MySql做爲存儲時,須要以下配置</code></div><div class="line number7 index6 alt2"><code class="csharp spaces">&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="csharp comments">//運用MySql存儲,對應web.config中的connectionStrings中的name</code></div><div class="line number8 index7 alt1"><code class="csharp spaces">&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="csharp plain">GlobalConfiguration.Configuration.UseStorage(</code><code class="csharp keyword">new</code> <code class="csharp plain">MySqlStorage(</code><code class="csharp string">"mysql_connection"</code><code class="csharp plain">));</code></div><div class="line number9 index8 alt2">&nbsp;</div><div class="line number10 index9 alt1"><code class="csharp spaces">&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="csharp plain">app.UseHangfireDashboard();</code><code class="csharp comments">//配置後臺儀表盤</code></div><div class="line number11 index10 alt2"><code class="csharp spaces">&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="csharp plain">app.UseHangfireServer();</code><code class="csharp comments">//開始使用Hangfire服務</code></div><div class="line number12 index11 alt1">&nbsp;</div><div class="line number13 index12 alt2"><code class="csharp plain">}</code></div></div></td></tr></tbody></table></div></div> </div> <a name="_label4_2_3"></a><h4>Web.config數據庫鏈接配置:</h4> <p><strong>1.MS SQL Server中:</strong></p> <div class="cnblogs_code"> <pre>&lt;connectionStrings&gt; &lt;add name=<span style="color: #800000;">"</span><span style="color: #800000;">sqlserver_connection</span><span style="color: #800000;">"</span> connectionString=<span style="color: #800000;">"</span><span style="color: #800000;">Data Source=.;Initial Catalog=MyFirstDb;Integrated Security=True</span><span style="color: #800000;">"</span> providerName=<span style="color: #800000;">"</span><span style="color: #800000;">System.Data.SqlClient</span><span style="color: #800000;">"</span> /&gt; &lt;/connectionStrings&gt;</pre> </div> <p>&nbsp;</p> <p><strong>2.MySQL中:</strong></p> <div class="cnblogs_code"> <pre>&lt;connectionStrings&gt; &lt;add name=<span style="color: #800000;">"</span><span style="color: #800000;">mysql_connection</span><span style="color: #800000;">"</span> providerName=<span style="color: #800000;">"</span><span style="color: #800000;">System.Data.MySqlClient</span><span style="color: #800000;">"</span> connectionString=<span style="color: #800000;">"</span><span style="color: #800000;">Server=123.xxx.xxx.xx;Port=3306;Database=MyFirstDb;Uid=root;Pwd=youpassword;charset=utf8;SslMode=none;Allow User Variables=True</span><span style="color: #800000;">"</span> /&gt; &lt;/connectionStrings&gt;</pre> </div> <p>&nbsp;</p> <a name="_label4_3"></a><h3>運行程序,訪問調度控制面板:</h3> <p>  當咱們已經完成了上面的相關配置後,且程序可以正常無bug的運行時,咱們的Hangfire Dashboard(儀表盤)在咱們的本地就能夠正常訪問了(Hangfire儀表盤默認只支持本地訪問),假如須要遠程可訪問的話咱們還須要作對應的配置受權操做!  </p> <a name="_label4_3_0"></a><h4>運行成功,查看數據庫中是否生成了與Hangfire相關的表:</h4> <p>  首次運行成功後,打開數據庫能夠看到Hangfire已經自動爲咱們建立了定時任務的一些定時任務列表,定時隊列,服務,狀態等相關的數據表(展示了Hangfire做用的持久化特性),以下圖所示:</p> <p><strong>a.MS SQL Server中生成的表:</strong></p> <p><img src="https://img2018.cnblogs.com/blog/1336199/201909/1336199-20190930015159406-225896067.png" alt=""></p> <p>&nbsp;</p> <p><strong>&nbsp;b.MySQL中生成的表:</strong></p> <p><img src="https://img2018.cnblogs.com/blog/1336199/201909/1336199-20190930015239389-1347380917.png" alt=""></p> <p>&nbsp;</p> <a name="_label4_3_1"></a><h4>&nbsp;訪問調度控制面板:</h4> <p>本地訪問方式:https://localhost:端口號/hangfire/</p> <p>調度控制面板效果圖:</p> <p><img src="https://img2018.cnblogs.com/blog/1336199/201909/1336199-20190930015547922-1145741350.png" alt=""></p> <p>&nbsp;</p> <a name="_label4_4"></a><h3>&nbsp;後臺經常使用任務調度建立和使用:</h3> <div class="cnblogs_code"><div class="cnblogs_code_toolbar"><span class="cnblogs_code_copy"><a href="javascript:void(0);" onclick="copyCnblogsCode(this)" title="複製代碼"><img src="//common.cnblogs.com/images/copycode.gif" alt="複製代碼"></a></span></div> <pre><span style="color: #008000;">//</span><span style="color: #008000;">支持基於隊列的任務處理:任務執行不是同步的,而是放到一個持久化隊列中,以便立刻把請求控制權返回給調用者。</span> <span style="color: #0000ff;">var</span> jobId = BackgroundJob.Enqueue(() =&gt; WriteLog(<span style="color: #800000;">"</span><span style="color: #800000;">隊列任務</span><span style="color: #800000;">"</span><span style="color: #000000;">));html

</span><span style="color: #008000;">//</span><span style="color: #008000;">延遲任務執行:不是立刻調用方法,而是設定一個將來時間點再來執行,延遲做業僅執行一次</span> <span style="color: #0000ff;">var</span> jobId = BackgroundJob .Schedule(()=> Console .WriteLine(<span style="color: #800000;">""</span>),TimeSpan .FromDays(<span style="color: #800080;">1</span>));<span style="color: #008000;">//</span><span style="color: #008000;">一天後執行該任務java

</span><span style="color: #008000;">//</span><span style="color: #008000;">循環任務執行:一行代碼添加劇復執行的任務,其內置了常見的時間循環模式,也可基於CRON表達式來設定複雜的模式。【用的比較的多】</span> RecurringJob.AddOrUpdate(() => WriteLog(<span style="color: #800000;">"</span><span style="color: #800000;">每分鐘執行任務</span><span style="color: #800000;">"</span>), Cron.Minutely); <span style="color: #008000;">//</span><span style="color: #008000;">注意最小單位是分鐘mysql

</span><span style="color: #008000;">//</span><span style="color: #008000;">延續性任務執行:相似於.NET中的Task,能夠在第一個任務執行完以後緊接着再次執行另外的任務</span> BackgroundJob.ContinueWith(jobId, () => WriteLog(<span style="color: #800000;">"</span><span style="color: #800000;">連續任務</span><span style="color: #800000;">"</span>));</pre>git

<div class="cnblogs_code_toolbar"><span class="cnblogs_code_copy"><a href="javascript:void(0);" onclick="copyCnblogsCode(this)" title="複製代碼"><img src="//common.cnblogs.com/images/copycode.gif" alt="複製代碼"></a></span></div></div> <div style="text-align: right"><a href="#_labelTop"><b style="font-family:Arial,Helvetica,sans-serif;">回到頂部</b></a><a name="_label5"></a></div><h2>總結:</h2> <p>  經過本次項目實踐的確讓我感覺到了Hangfire的魅力所在,真的能夠說是上手簡單,開箱即用的一個任務調度框架。而且該框架作的最好的是,官方文檔詳細,而且還提供了完整的demo示例。最後要爲Hangfire的做者點贊!</p> <div style="text-align: right"><a href="#_labelTop"><b style="font-family:Arial,Helvetica,sans-serif;">回到頂部</b></a><a name="_label6"></a></div><h2>Hangfire相關使用學習資料:</h2> <p>官網地址:<a href="https://www.hangfire.io/">https://www.hangfire.io/</a></p> <p>GitHub源碼:<a href="https://github.com/HangfireIO/Hangfire">https://github.com/HangfireIO/Hangfire</a></p> <p>中文文檔:<a href="https://www.bookstack.cn/read/Hangfire-zh-official/README.md">https://www.bookstack.cn/read/Hangfire-zh-official/README.md</a>&nbsp;</p> <p>GitHub使用示例源碼:<a href="https://github.com/HangfireIO/Hangfire.Samples">https://github.com/HangfireIO/Hangfire.Samples</a>(包括控制檯應用程序,window服務,ASP.NET MVC,WebForm)</p> <p>Hangfire使用文章彙總:<a href="https://www.bbsmax.com/R/xl56E0nrJr/">https://www.bbsmax.com/R/xl56E0nrJr/</a></p> <p>&nbsp;</p> </div> <div id="MySignature"></div> <div class="clear"></div> <div id="blog_post_info_block"> <div id="EntryTag"> 標籤: <a href="https://www.cnblogs.com/Can-daydayup/tag/%E3%80%90.Net%E3%80%91/">【.Net】</a>, <a href="https://www.cnblogs.com/Can-daydayup/tag/%E3%80%90ASP.NET%E3%80%91/">【ASP.NET】</a>, <a href="https://www.cnblogs.com/Can-daydayup/tag/%E3%80%90Hangfire%E3%80%91/">【Hangfire】</a></div>github

<div id="blog_post_info">

<div id="green_channel"> <a href="javascript:void(0);" id="green_channel_digg" onclick="DiggIt(11610747,cb_blogId,1);green_channel_success(this,'謝謝推薦!');">好文要頂</a> <a id="green_channel_follow" onclick="follow('b03019b6-0299-4937-53e1-08d54dba4453');" href="javascript:void(0);">關注我</a> <a id="green_channel_favorite" onclick="AddToWz(cb_entryId);return false;" href="javascript:void(0);">收藏該文</a> <a id="green_channel_weibo" href="javascript:void(0);" title="分享至新浪微博" onclick="ShareToTsina()"><img src="https://common.cnblogs.com/images/icon_weibo_24.png" alt=""></a> <a id="green_channel_wechat" href="javascript:void(0);" title="分享至微信" onclick="shareOnWechat()"><img src="https://common.cnblogs.com/images/wechat.png" alt=""></a> </div> <div id="author_profile"> <div id="author_profile_info" class="author_profile_info"> <a href="https://home.cnblogs.com/u/Can-daydayup/" target="_blank"><img src="https://pic.cnblogs.com/face/1336199/20180223001924.png" class="author_avatar" alt=""></a> <div id="author_profile_detail" class="author_profile_info"> <a href="https://home.cnblogs.com/u/Can-daydayup/">追逐時光</a><br> <a href="https://home.cnblogs.com/u/Can-daydayup/followees/">關注 - 69</a><br> <a href="https://home.cnblogs.com/u/Can-daydayup/followers/">粉絲 - 32</a> </div> </div> <div class="clear"></div> <div id="author_profile_honor"></div> <div id="author_profile_follow"> <a href="javascript:void(0);" onclick="follow('b03019b6-0299-4937-53e1-08d54dba4453');return false;">+加關注</a> </div> </div> <div id="div_digg"> <div class="diggit" onclick="votePost(11610747,'Digg')"> <span class="diggnum" id="digg_count">5</span> </div> <div class="buryit" onclick="votePost(11610747,'Bury')"> <span class="burynum" id="bury_count">0</span> </div> <div class="clear"></div> <div class="diggword" id="digg_tips"> </div> </div>web

<script type="text/javascript"> currentDiggType = 0; </script></div>sql

<div class="clear"></div>
<div id="post_next_prev">

<a href="https://www.cnblogs.com/Can-daydayup/p/11588531.html" class="p_n_p_prefix">« </a> 上一篇:    <a href="https://www.cnblogs.com/Can-daydayup/p/11588531.html" title="發佈於 2019-09-28 00:36">.NET Core使用NPOI導出複雜Word詳解</a>

</div> </div> </div>數據庫

相關文章
相關標籤/搜索