王建祥
(河南省濟源鋼鐵<集團>有限公司信息化儀表處信息化科 河南 濟源 454650)
基于ASP.Net Core的工作日志上傳系統是利用ASP.Net Core MVC的優勢,使用基于內置依賴注入和接口技術的軟件設計,實現的功能是:用戶使用Web登錄系統,添加工作日志記錄,所添加的日志記錄的文本添加到數據庫中,上傳附件文件添加到root用戶下的/root/JobLogSystem/publish/wwwroot/file路徑的文件夾中。
本系統的優點:(1)使用ASP.Net Core MVC技術,軟件系統對用戶來說使用B/S架構,較C/S架構的應用軟件系統有明顯優勢[1],使整個系統的軟件設計標準化和輕量化,用戶使用Web登錄添加工作日志記錄。(2)使用ASP.Net Core的跨平臺特性,將軟件發布后的文件部署到Oracle Linux 7.6服務器進行測試和試運行。
ASP.Net Core的優勢:(1)開源、跨平臺。ASP.NET Core是開放源代碼通用開發平臺,由Microsoft和.NET社區在GitHub上共同維護,跨平臺支持 Windows、Linux和macOS,用于構建Web應用、IOT應用和移動后端APP應用;(2)性能優越。根據ASP.Net Core團隊的性能測試數據,ASP.Net Core(.net core)相較Web(.net framework 4.6)程序性能提升約2300%;(3)內置依賴注入;(4)輕量級和模塊化的中間件HTTP請求管道;(5)能夠在Linux操作系統或Windows服務器的IIS上運行。
2.2.1 ASP.Net Core總體性能概述
本系統ASP.Net Core設計使用的技術主要有:(1)開發軟件使用Visual Studio2019和c#語言,主要框架使用ASP.NET Core MVC,.Net Core2.2是目前較新的版本;(2)數據庫使用.Net Core 2.2自帶的EF Core2.2技術,切換數據庫只需要修改幾行代碼就可實現;(3)使用ASP.NET Core Web API可構建多種客戶端的http服務;(4)基于接口的異步編程技術提高運行效率和程序的可擴展性;(5)ASP.NET Core Identity身份認證技術,提高程序的安全性同時簡化編程;(6)把編譯的應用程序代碼部署和發布到Oracle Linux 7.6服務器。
2.2.2 ASP.Net Core項目的總體架構
本項目使用ASP.Net Core MVC架構和C#編程技術,在編程完成后,由Visual Studio2019工具通過發布功能生成Publish文件夾,把Publish文件夾部署到Oracle Linux 7.6操作系統。發布和部署Publish文件夾到Oracle Linux 7.6操作系統過程如下。
(1)安裝.net core sdk 2.2。
(2)安裝Nginx反向代理服務器軟件。反向代理服務器有安全過濾、內容緩存、負載均衡的作用。Nginx反向代理器開啟后用戶輸入網址發起請求后,請求先到達Nginx代理服務器,Nginx代理服務器再把請求轉給數據服務器,從而減輕數據服務器的壓力。
(3)配置守護進程Supervisor,用于Oracle Linux 7.6服務器開機后可以自動啟動運行.net core sdk 2.2,Oracle Linux 7.6服務器停機檢修后重啟不會影響用戶Web訪問。
綜上所述,ASP.Net Core MVC項目總體架構見圖1。

圖1 ASP.Net Core MVC項目總體架構圖
本系統使用ASP.Net Core MVC架構,使用Visual Studio2019工具和C#進行軟件開發,步驟如下。
3.1.1 Program.cs文件
Program.cs文件表明該項目本質是控制臺項目,IIS Express運行按鍵右側的下拉菜單中選擇“JobLogUploadSystem”就可進入控制臺運行程序;Program.cs作為Web應用程序的默認入口,不做任何修改的情況下,會調用同目錄下 Startup.cs中的 ConfigureServices()方法和Configure()方法;Build方法構建Web應用程序,然后去運行CreateWebHostBuilder(args)調用下面的方法,返回IWebHostBuilder對象,從而運行Web應用程序,即啟動始終運行監聽http請求的任務;使用默認的配置信息來初始化新的IWebHostBuilder實例,為WebHost指定Startup類。
3.1.2 Startup.cs文件
Startup.cs文件啟動項目后做初始化的設置工作,在ConfigureServices()方法中注入項目所需的服務和中間件。服務就是類,用于實現某功能的函數或稱方法,中間件是方法和委托;ConfigureServices方法用于把各類服務services, 例如identity、ef、mvc等包括第三方服務注冊register到asp.net core的容器container中去,并配置這些服務services。容器container是用來進行依賴注入dependency injection。所有注入的服務services,包括框架已經注冊的服務services,在后面編程時可注入inject到代碼,即在代碼需要的地方能直接使用ConfigureServices()中已經依賴注入的對象。Configure()方法是asp.net core程序用來具體指定處理每個http請求的方法, 例如調用app.UseMvc()方法使程序通過mvc來處理http請求。
3.2.1 創建C#實體類
在Models文件夾下創建實體類JobLog.cs,屬性標簽是[Required],需導入using System.ComponentModel.DataAnnotations,JobLog.cs實體類中的Id將會被EF Core自動識別成主鍵。
3.2.2 創建EF Core上下文類
創建繼承于DbContext上下文基類的上下文類JobLogContext,JobLogContext中自動會有基類下方法屬性可用,需導入using Microsoft.EntityFrameworkCore;此處注入方式使用通過需要傳參的構造函數的類的注入。因為注入JobLogContext服務后,編程時使用該類實例時仍需調用該類的構造方法去實例化對象,注入服務時需傳遞連數據庫的Action,因此構造函數必須是具有參數的構造函數,即通過需要傳遞參數的構造函數的類的注入。


3.2.4 根據實體類和上下文類生成數據庫對象
根據實體類JobLog.cs和上下文類JobLogContext.cs,通過EF core的遷移技術從模型生成數據庫對象。具體操作兩個命令執行:(1)Visual Studio 2019-工具-NuGet包管理器-程序包管理控制臺,輸入如下命令:Add-Migration JobLog2。說明:Add-Migration為遷移數據命令,遷移名稱是JobLog2,執行后會在項目根目錄下生成Migrations文件夾,文件夾下生成相關的類。
(2)Update-Database命令。說明:執行該命令,生成SQL SERVER數據庫中的相關數據對象。
3.2.5 添加操作數據庫的倉儲接口類
在JobLobSystem工程下創建文件夾Repository用于存放操作數據庫的倉儲文件,在Repository文件夾下添加IJobLogRepository.cs接口;

3.2.6 添加倉儲接口類的實現類
添加JobLogRepository.cs類用于實現IJobLogRepository.cs接口,JobLogRepository.cs實現類內使用異步方法用于提高執行效率。


3.2.7 在Startup.cs中注入倉儲類服務
在Startup.cs中注入倉儲類服務JobLogRepository.cs用于操作數據庫,此處使用接口形式注入。

3.2.8 添加JobLogController控制器
在Controller文件夾下添加JobLogController控制器,并實現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函數對應視圖
添加Add()函數對應視圖Add.cshtml,設計時按照如下參數設置[2];
視圖名稱:Add
模板:Create
模型類:JobLogModle (JobLogSystem.ViewModels)
數據庫上下文類:JobLogContext(JobLogSystem.Models)
3.2.10 添加Index()函數對應視圖
添加Index()函數對應視圖Index.cshtml,設計時按照如下參數設置;
視圖名稱: Index
模板: List
模型類: JobLog(JobLogSystem.Models)
數據庫上下文類: JobLogContext(JobLogSystem.Models)
3.3.1 添加工作日志記錄分類選項的流程
為工作日志記錄添加可選類型的具體編程流程,見圖2。

圖2 為工作日志記錄添加可選類型的具體流程
3.3.2 添加工作日志記錄分類選項的效果
添加工作日志記錄分類選項后的程序運行效果,見圖3。

圖3 添加工作日志記錄分類選項的程序運行效果
下面使用ASP.NET Core Identity實現用戶注冊和登錄[3],以及綁定對應的JobLog.cs類,然后用戶上傳和查看JobLog記錄。
3.4.1 安裝Nuget依賴包
安裝Microsoft.AspNetCore.Identity.EntityFramework CoreNuget依賴包,配合EF Core操作數據庫存儲數據。
3.4.2 添加用戶類
在Models文件夾中添加繼承于IdentityUser的JobLogUser類,JobLogUser類就會自動添加IdentityUser的默認username、email等常用的用戶屬性,也可添加用戶地址等其他屬性。JobLogUser代表網站的注冊用戶,內置的IdentityUser屬性能根據需要擴展使用。
using Microsoft.AspNetCore.Identity; //需要導入Identity命名空間

3.4.3 改造上下文類
導入using Microsoft.AspNetCore.Identity.EntityFrameworkCore,把JobLogContext上下文類原來繼承于DbContext.cs改成繼承于IdentityDbContext.cs;


3.4.4 更新數據庫對象
打開程序包管理控制臺執行以下命令:

執行完畢后,SQL SERVER數據庫即可更新對應的數據對象。
3.4.5 在Startup中注入Identity服務3.4.5.1 ConfigureService方法中注入Identity服務在Startup類的ConfigureService方法中注入Identity服務,通過依賴注入使Identity服務可用于應用程序。

3.4.5.2 Configure方法中調用UseAuthentication
在startup類的Configure()方法中調用UseAuthentication()方法為應用程序啟動Identity中間件。
app.UseAuthentication(); //啟 用UseAuthentication為應用程序啟動Identity服務。
3.4.6 添加兩個ViewModel用于生成視圖
添加LoginViewModel類和RegisterViewModel類,分別對應于登錄與注冊的需要,并通過打上特性來保證相應字段的要求,后面會使用這兩個類生成視圖。
3.4.7 添加控制器
添加控制器AccountController


3.4.8 創建視圖Login.cshtml及Register.cshtml
3.4.8.1創建Login.cshtml視圖
按照如下配置創建Login.cshtml視圖并修改其代碼;
視圖名稱: Login
模板: Create
模板類: LoginViewModel(JobLogSystem.ViewModels)
數據上下文類: JobLogContext(JobLogSystem.Models)
3.4.8.2創建Register.cshtml視圖
按照如下配置創建Register.cshtml視圖并修改其代碼;
視圖名稱: Register
模板: Create
模板類: RegisterViewModel(JobLogSystem.ViewModels)
數據上下文類: JobLogContext(JobLogSystem.Models)
創建視圖Login.cshtml及Register.cshtml后修改其代碼,即可實現注冊—登錄—注銷等用戶功能,具體實現過程:訪問Account控制器,UserManager和SignInManager服務被注入到Controller中,如果是注冊提交信息,Register操作調用UserManager的CreateAsync方法創建用戶,注冊成功后跳轉到Login,輸入剛注冊的信息登錄,Login操作調用SingInManager的PasswordSignInAsync方法登錄用戶并寫Cookie信息,登錄以后注銷將調用LogOff操作,調用SignInManager的SignOutAsync方法注銷用戶,并清除Cookie信息。
工作日志上傳系統軟件總體結構見圖4。

圖4 工作日志上傳系統軟件總體結構
(1)在虛擬機Vmware Workstation軟件中安裝Oracle Linux 7.6操作系統。
(2)在Oracle Linux 7.6的目錄:在Visual Studio 2019軟件執行發布操作,生成publish發布文件夾,將publish發布文件夾上傳到Oracle Linux 7.6中root用戶下的 /root/JobLogSystem路徑。
(3)在Oracle Linux 7.6中root用戶下安裝.NET CORE SDK2.2軟件[4]。
(4)安裝配置Nginx反向代理軟件,用于減輕服務器工作壓力。
(5)配置守護進程Supervisor,使Oracle Linux 7.6操作系統重啟后自動SDK服務,不影響用戶訪問Web服務。
(1)運行虛擬機下的Oracle Linux 7.6,見圖5。

圖5 運行虛擬機下的Oracle Linux 7.6
(2)在Google Chrome瀏覽器下,輸入地址: 192.168.1.103:5000,回車運行,見圖6。

圖6 工作日志上傳系統登錄界面
(3)點擊“注冊”按鍵,見圖7。

圖7 點擊注冊按鍵
輸入,點擊“注冊”;注冊成功沒有提示。注冊錯誤會顯示注冊信息錄入錯誤的原因,請按提示重新錄入注冊信息,直到注冊成功。
(4)在登錄界面,輸入用戶名“ZhangSan”,密碼”123456”,點擊“登錄“。見圖8。

圖8 登錄后界面
(5)點擊“Create“按鍵后,手動錄入新的運維記錄,見圖9。

圖9 錄入工作日志記錄界面
(6)點擊“Create“按鍵,見圖10。

圖10 添加工作日志記錄后回到顯示界面
(7)下載20210107張三上傳的《20210107誤工記錄》,點擊“張三 20-1-7下午9:58:27”記錄對應的“下載按鍵”,彈出新建下載任務對話框,選擇下載路徑,點擊保存,即可下載《20210107誤工記錄》文檔,見圖11。

圖11 下載工作日志記錄中的文件
由上述軟件部署實施和試運行可知:(1)跨平臺和輕量級。本系統基于ASP.NET CORE的軟件設計,可以經發布后部署到Linux服務器,實現了軟件的跨平臺部署;由于軟件采用基于依賴注入和接口的技術,可以根據需要注入服務的特性使得程序較為輕量。
(2)輕松實現數據庫遷移。本系統剛開始使用數據庫SQL SERVER,發布操作生成的publish文件部署到Oracle Linux 7.6后,添加日志記錄后,信息記錄上傳到SQL SERVER服務器,而日志記錄中的文件則上傳到Oracle Linux 7.6的/root/JobLogSystem/publish/wwwroot/file目錄。只需要改動一句程序就可實現改用文件數據庫SQlite,由于SQlite可以存在于publish文件夾中,所以添加日志記錄后,信息記錄和上傳的文件記錄都在Oracle Linux 7.6的publish文件夾中。
(3)EF CORE技術可以很方便地用于SQL SERVER數據庫,對于EF CORE技術用于Oracle數據庫,正在學習與研究。