王建祥
(河南省濟(jì)源鋼鐵<集團(tuán)>有限公司信息化儀表處信息化科 河南 濟(jì)源 454650)
基于ASP.Net Core的工作日志上傳系統(tǒng)是利用ASP.Net Core MVC的優(yōu)勢,使用基于內(nèi)置依賴注入和接口技術(shù)的軟件設(shè)計,實現(xiàn)的功能是:用戶使用Web登錄系統(tǒng),添加工作日志記錄,所添加的日志記錄的文本添加到數(shù)據(jù)庫中,上傳附件文件添加到root用戶下的/root/JobLogSystem/publish/wwwroot/file路徑的文件夾中。
本系統(tǒng)的優(yōu)點:(1)使用ASP.Net Core MVC技術(shù),軟件系統(tǒng)對用戶來說使用B/S架構(gòu),較C/S架構(gòu)的應(yīng)用軟件系統(tǒng)有明顯優(yōu)勢[1],使整個系統(tǒng)的軟件設(shè)計標(biāo)準(zhǔn)化和輕量化,用戶使用Web登錄添加工作日志記錄。(2)使用ASP.Net Core的跨平臺特性,將軟件發(fā)布后的文件部署到Oracle Linux 7.6服務(wù)器進(jìn)行測試和試運(yùn)行。
ASP.Net Core的優(yōu)勢:(1)開源、跨平臺。ASP.NET Core是開放源代碼通用開發(fā)平臺,由Microsoft和.NET社區(qū)在GitHub上共同維護(hù),跨平臺支持 Windows、Linux和macOS,用于構(gòu)建Web應(yīng)用、IOT應(yīng)用和移動后端APP應(yīng)用;(2)性能優(yōu)越。根據(jù)ASP.Net Core團(tuán)隊的性能測試數(shù)據(jù),ASP.Net Core(.net core)相較Web(.net framework 4.6)程序性能提升約2300%;(3)內(nèi)置依賴注入;(4)輕量級和模塊化的中間件HTTP請求管道;(5)能夠在Linux操作系統(tǒng)或Windows服務(wù)器的IIS上運(yùn)行。
2.2.1 ASP.Net Core總體性能概述
本系統(tǒng)ASP.Net Core設(shè)計使用的技術(shù)主要有:(1)開發(fā)軟件使用Visual Studio2019和c#語言,主要框架使用ASP.NET Core MVC,.Net Core2.2是目前較新的版本;(2)數(shù)據(jù)庫使用.Net Core 2.2自帶的EF Core2.2技術(shù),切換數(shù)據(jù)庫只需要修改幾行代碼就可實現(xiàn);(3)使用ASP.NET Core Web API可構(gòu)建多種客戶端的http服務(wù);(4)基于接口的異步編程技術(shù)提高運(yùn)行效率和程序的可擴(kuò)展性;(5)ASP.NET Core Identity身份認(rèn)證技術(shù),提高程序的安全性同時簡化編程;(6)把編譯的應(yīng)用程序代碼部署和發(fā)布到Oracle Linux 7.6服務(wù)器。
2.2.2 ASP.Net Core項目的總體架構(gòu)
本項目使用ASP.Net Core MVC架構(gòu)和C#編程技術(shù),在編程完成后,由Visual Studio2019工具通過發(fā)布功能生成Publish文件夾,把Publish文件夾部署到Oracle Linux 7.6操作系統(tǒng)。發(fā)布和部署Publish文件夾到Oracle Linux 7.6操作系統(tǒng)過程如下。
(1)安裝.net core sdk 2.2。
(2)安裝Nginx反向代理服務(wù)器軟件。反向代理服務(wù)器有安全過濾、內(nèi)容緩存、負(fù)載均衡的作用。Nginx反向代理器開啟后用戶輸入網(wǎng)址發(fā)起請求后,請求先到達(dá)Nginx代理服務(wù)器,Nginx代理服務(wù)器再把請求轉(zhuǎn)給數(shù)據(jù)服務(wù)器,從而減輕數(shù)據(jù)服務(wù)器的壓力。
(3)配置守護(hù)進(jìn)程Supervisor,用于Oracle Linux 7.6服務(wù)器開機(jī)后可以自動啟動運(yùn)行.net core sdk 2.2,Oracle Linux 7.6服務(wù)器停機(jī)檢修后重啟不會影響用戶Web訪問。
綜上所述,ASP.Net Core MVC項目總體架構(gòu)見圖1。
圖1 ASP.Net Core MVC項目總體架構(gòu)圖
本系統(tǒng)使用ASP.Net Core MVC架構(gòu),使用Visual Studio2019工具和C#進(jìn)行軟件開發(fā),步驟如下。
3.1.1 Program.cs文件
Program.cs文件表明該項目本質(zhì)是控制臺項目,IIS Express運(yùn)行按鍵右側(cè)的下拉菜單中選擇“JobLogUploadSystem”就可進(jìn)入控制臺運(yùn)行程序;Program.cs作為Web應(yīng)用程序的默認(rèn)入口,不做任何修改的情況下,會調(diào)用同目錄下 Startup.cs中的 ConfigureServices()方法和Configure()方法;Build方法構(gòu)建Web應(yīng)用程序,然后去運(yùn)行CreateWebHostBuilder(args)調(diào)用下面的方法,返回IWebHostBuilder對象,從而運(yùn)行Web應(yīng)用程序,即啟動始終運(yùn)行監(jiān)聽http請求的任務(wù);使用默認(rèn)的配置信息來初始化新的IWebHostBuilder實例,為WebHost指定Startup類。
3.1.2 Startup.cs文件
Startup.cs文件啟動項目后做初始化的設(shè)置工作,在ConfigureServices()方法中注入項目所需的服務(wù)和中間件。服務(wù)就是類,用于實現(xiàn)某功能的函數(shù)或稱方法,中間件是方法和委托;ConfigureServices方法用于把各類服務(wù)services, 例如identity、ef、mvc等包括第三方服務(wù)注冊register到asp.net core的容器container中去,并配置這些服務(wù)services。容器container是用來進(jìn)行依賴注入dependency injection。所有注入的服務(wù)services,包括框架已經(jīng)注冊的服務(wù)services,在后面編程時可注入inject到代碼,即在代碼需要的地方能直接使用ConfigureServices()中已經(jīng)依賴注入的對象。Configure()方法是asp.net core程序用來具體指定處理每個http請求的方法, 例如調(diào)用app.UseMvc()方法使程序通過mvc來處理http請求。
3.2.1 創(chuàng)建C#實體類
在Models文件夾下創(chuàng)建實體類JobLog.cs,屬性標(biāo)簽是[Required],需導(dǎo)入using System.ComponentModel.DataAnnotations,JobLog.cs實體類中的Id將會被EF Core自動識別成主鍵。
3.2.2 創(chuàng)建EF Core上下文類
創(chuàng)建繼承于DbContext上下文基類的上下文類JobLogContext,JobLogContext中自動會有基類下方法屬性可用,需導(dǎo)入using Microsoft.EntityFrameworkCore;此處注入方式使用通過需要傳參的構(gòu)造函數(shù)的類的注入。因為注入JobLogContext服務(wù)后,編程時使用該類實例時仍需調(diào)用該類的構(gòu)造方法去實例化對象,注入服務(wù)時需傳遞連數(shù)據(jù)庫的Action,因此構(gòu)造函數(shù)必須是具有參數(shù)的構(gòu)造函數(shù),即通過需要傳遞參數(shù)的構(gòu)造函數(shù)的類的注入。
3.2.4 根據(jù)實體類和上下文類生成數(shù)據(jù)庫對象
根據(jù)實體類JobLog.cs和上下文類JobLogContext.cs,通過EF core的遷移技術(shù)從模型生成數(shù)據(jù)庫對象。具體操作兩個命令執(zhí)行:(1)Visual Studio 2019-工具-NuGet包管理器-程序包管理控制臺,輸入如下命令:Add-Migration JobLog2。說明:Add-Migration為遷移數(shù)據(jù)命令,遷移名稱是JobLog2,執(zhí)行后會在項目根目錄下生成Migrations文件夾,文件夾下生成相關(guān)的類。
(2)Update-Database命令。說明:執(zhí)行該命令,生成SQL SERVER數(shù)據(jù)庫中的相關(guān)數(shù)據(jù)對象。
3.2.5 添加操作數(shù)據(jù)庫的倉儲接口類
在JobLobSystem工程下創(chuàng)建文件夾Repository用于存放操作數(shù)據(jù)庫的倉儲文件,在Repository文件夾下添加IJobLogRepository.cs接口;
3.2.6 添加倉儲接口類的實現(xiàn)類
添加JobLogRepository.cs類用于實現(xiàn)IJobLogRepository.cs接口,JobLogRepository.cs實現(xiàn)類內(nèi)使用異步方法用于提高執(zhí)行效率。
3.2.7 在Startup.cs中注入倉儲類服務(wù)
在Startup.cs中注入倉儲類服務(wù)JobLogRepository.cs用于操作數(shù)據(jù)庫,此處使用接口形式注入。
3.2.8 添加JobLogController控制器
在Controller文件夾下添加JobLogController控制器,并實現(xiàn)Index操作及Add操作。
3.2.8.1 Controller文件夾下添加JobLogController控制器
3.2.8.2 展示添加頁面
public IActionJobLog Add(){return View();}//顯示增加記錄界面。
3.2.8.3 展示添加日志記錄界面
3.2.9 添加Add函數(shù)對應(yīng)視圖
添加Add()函數(shù)對應(yīng)視圖Add.cshtml,設(shè)計時按照如下參數(shù)設(shè)置[2];
視圖名稱:Add
模板:Create
模型類:JobLogModle (JobLogSystem.ViewModels)
數(shù)據(jù)庫上下文類:JobLogContext(JobLogSystem.Models)
3.2.10 添加Index()函數(shù)對應(yīng)視圖
添加Index()函數(shù)對應(yīng)視圖Index.cshtml,設(shè)計時按照如下參數(shù)設(shè)置;
視圖名稱: Index
模板: List
模型類: JobLog(JobLogSystem.Models)
數(shù)據(jù)庫上下文類: JobLogContext(JobLogSystem.Models)
3.3.1 添加工作日志記錄分類選項的流程
為工作日志記錄添加可選類型的具體編程流程,見圖2。
圖2 為工作日志記錄添加可選類型的具體流程
3.3.2 添加工作日志記錄分類選項的效果
添加工作日志記錄分類選項后的程序運(yùn)行效果,見圖3。
圖3 添加工作日志記錄分類選項的程序運(yùn)行效果
下面使用ASP.NET Core Identity實現(xiàn)用戶注冊和登錄[3],以及綁定對應(yīng)的JobLog.cs類,然后用戶上傳和查看JobLog記錄。
3.4.1 安裝Nuget依賴包
安裝Microsoft.AspNetCore.Identity.EntityFramework CoreNuget依賴包,配合EF Core操作數(shù)據(jù)庫存儲數(shù)據(jù)。
3.4.2 添加用戶類
在Models文件夾中添加繼承于IdentityUser的JobLogUser類,JobLogUser類就會自動添加IdentityUser的默認(rèn)username、email等常用的用戶屬性,也可添加用戶地址等其他屬性。JobLogUser代表網(wǎng)站的注冊用戶,內(nèi)置的IdentityUser屬性能根據(jù)需要擴(kuò)展使用。
using Microsoft.AspNetCore.Identity; //需要導(dǎo)入Identity命名空間
3.4.3 改造上下文類
導(dǎo)入using Microsoft.AspNetCore.Identity.EntityFrameworkCore,把JobLogContext上下文類原來繼承于DbContext.cs改成繼承于IdentityDbContext.cs;
3.4.4 更新數(shù)據(jù)庫對象
打開程序包管理控制臺執(zhí)行以下命令:
執(zhí)行完畢后,SQL SERVER數(shù)據(jù)庫即可更新對應(yīng)的數(shù)據(jù)對象。
3.4.5 在Startup中注入Identity服務(wù)3.4.5.1 ConfigureService方法中注入Identity服務(wù)在Startup類的ConfigureService方法中注入Identity服務(wù),通過依賴注入使Identity服務(wù)可用于應(yīng)用程序。
3.4.5.2 Configure方法中調(diào)用UseAuthentication
在startup類的Configure()方法中調(diào)用UseAuthentication()方法為應(yīng)用程序啟動Identity中間件。
app.UseAuthentication(); //啟 用UseAuthentication為應(yīng)用程序啟動Identity服務(wù)。
3.4.6 添加兩個ViewModel用于生成視圖
添加LoginViewModel類和RegisterViewModel類,分別對應(yīng)于登錄與注冊的需要,并通過打上特性來保證相應(yīng)字段的要求,后面會使用這兩個類生成視圖。
3.4.7 添加控制器
添加控制器AccountController
3.4.8 創(chuàng)建視圖Login.cshtml及Register.cshtml
3.4.8.1創(chuàng)建Login.cshtml視圖
按照如下配置創(chuàng)建Login.cshtml視圖并修改其代碼;
視圖名稱: Login
模板: Create
模板類: LoginViewModel(JobLogSystem.ViewModels)
數(shù)據(jù)上下文類: JobLogContext(JobLogSystem.Models)
3.4.8.2創(chuàng)建Register.cshtml視圖
按照如下配置創(chuàng)建Register.cshtml視圖并修改其代碼;
視圖名稱: Register
模板: Create
模板類: RegisterViewModel(JobLogSystem.ViewModels)
數(shù)據(jù)上下文類: JobLogContext(JobLogSystem.Models)
創(chuàng)建視圖Login.cshtml及Register.cshtml后修改其代碼,即可實現(xiàn)注冊—登錄—注銷等用戶功能,具體實現(xiàn)過程:訪問Account控制器,UserManager和SignInManager服務(wù)被注入到Controller中,如果是注冊提交信息,Register操作調(diào)用UserManager的CreateAsync方法創(chuàng)建用戶,注冊成功后跳轉(zhuǎn)到Login,輸入剛注冊的信息登錄,Login操作調(diào)用SingInManager的PasswordSignInAsync方法登錄用戶并寫Cookie信息,登錄以后注銷將調(diào)用LogOff操作,調(diào)用SignInManager的SignOutAsync方法注銷用戶,并清除Cookie信息。
工作日志上傳系統(tǒng)軟件總體結(jié)構(gòu)見圖4。
圖4 工作日志上傳系統(tǒng)軟件總體結(jié)構(gòu)
(1)在虛擬機(jī)Vmware Workstation軟件中安裝Oracle Linux 7.6操作系統(tǒng)。
(2)在Oracle Linux 7.6的目錄:在Visual Studio 2019軟件執(zhí)行發(fā)布操作,生成publish發(fā)布文件夾,將publish發(fā)布文件夾上傳到Oracle Linux 7.6中root用戶下的 /root/JobLogSystem路徑。
(3)在Oracle Linux 7.6中root用戶下安裝.NET CORE SDK2.2軟件[4]。
(4)安裝配置Nginx反向代理軟件,用于減輕服務(wù)器工作壓力。
(5)配置守護(hù)進(jìn)程Supervisor,使Oracle Linux 7.6操作系統(tǒng)重啟后自動SDK服務(wù),不影響用戶訪問Web服務(wù)。
(1)運(yùn)行虛擬機(jī)下的Oracle Linux 7.6,見圖5。
圖5 運(yùn)行虛擬機(jī)下的Oracle Linux 7.6
(2)在Google Chrome瀏覽器下,輸入地址: 192.168.1.103:5000,回車運(yùn)行,見圖6。
圖6 工作日志上傳系統(tǒng)登錄界面
(3)點擊“注冊”按鍵,見圖7。
圖7 點擊注冊按鍵
輸入,點擊“注冊”;注冊成功沒有提示。注冊錯誤會顯示注冊信息錄入錯誤的原因,請按提示重新錄入注冊信息,直到注冊成功。
(4)在登錄界面,輸入用戶名“ZhangSan”,密碼”123456”,點擊“登錄“。見圖8。
圖8 登錄后界面
(5)點擊“Create“按鍵后,手動錄入新的運(yùn)維記錄,見圖9。
圖9 錄入工作日志記錄界面
(6)點擊“Create“按鍵,見圖10。
圖10 添加工作日志記錄后回到顯示界面
(7)下載20210107張三上傳的《20210107誤工記錄》,點擊“張三 20-1-7下午9:58:27”記錄對應(yīng)的“下載按鍵”,彈出新建下載任務(wù)對話框,選擇下載路徑,點擊保存,即可下載《20210107誤工記錄》文檔,見圖11。
圖11 下載工作日志記錄中的文件
由上述軟件部署實施和試運(yùn)行可知:(1)跨平臺和輕量級。本系統(tǒng)基于ASP.NET CORE的軟件設(shè)計,可以經(jīng)發(fā)布后部署到Linux服務(wù)器,實現(xiàn)了軟件的跨平臺部署;由于軟件采用基于依賴注入和接口的技術(shù),可以根據(jù)需要注入服務(wù)的特性使得程序較為輕量。
(2)輕松實現(xiàn)數(shù)據(jù)庫遷移。本系統(tǒng)剛開始使用數(shù)據(jù)庫SQL SERVER,發(fā)布操作生成的publish文件部署到Oracle Linux 7.6后,添加日志記錄后,信息記錄上傳到SQL SERVER服務(wù)器,而日志記錄中的文件則上傳到Oracle Linux 7.6的/root/JobLogSystem/publish/wwwroot/file目錄。只需要改動一句程序就可實現(xiàn)改用文件數(shù)據(jù)庫SQlite,由于SQlite可以存在于publish文件夾中,所以添加日志記錄后,信息記錄和上傳的文件記錄都在Oracle Linux 7.6的publish文件夾中。
(3)EF CORE技術(shù)可以很方便地用于SQL SERVER數(shù)據(jù)庫,對于EF CORE技術(shù)用于Oracle數(shù)據(jù)庫,正在學(xué)習(xí)與研究。