筆記本電腦裝了雙系統(Windows 10和Ubuntu16.04)快半年了,平時有時間就喜歡切換到Ubuntu系統下耍耍Linux,熟悉熟悉Linux命令、Shell腳本以及Linux下的各類應用的安裝、配置、運行。使用下來的感覺是Linux確實至關好使,熟悉基本操做以後的工做的效率提高不是一星半點,何況如今Linux的使用面已經至關普遍,隨着.NET的跨平臺戰略的落地實施(.NET Core),.NET程序員也頗有必要熟悉Linux下的.NET開發。所以這篇博客,咱們就講解一下ubuntu下的asp.net core mvc開發。php
1、準備工做css
首先介紹一下個人開發環境:html
一、操做系統:ubuntu 16.04 mysql
ubuntu是目前主流的linux桌面系統,官方網站:https://www.ubuntu.com/download。jquery
二、開發工具:vscode 1.22.2linux
vscode(visual studio code,簡稱vscode)是微軟提供的跨平臺的代碼編輯器,能夠經過安裝擴展支持多種編程語言(C#、C++、Python、Node.js等等)。若是你以爲vs過重,能夠試試這個輕量級的vscode,官方網站:https://code.visualstudio.com/。git
三、運行環境:.net core 2.1程序員
.net core是微軟官方出的.net的跨平臺版本,咱們開發跨平臺的web應用,使用的asp.net core mvc須要安裝.net core運行環境,官方網站:https://dotnet.github.io/github
四、數據庫:mysql 5.7web
mysql不用多介紹了,數據庫領域三巨頭(oracle、mysql、sqlserver)之一,免費開源的跨平臺數據庫。自帶的MySQL Workbench能夠很是方便的操做mysql。聽說微軟的sqlserver也推出了linux版,之後有機會再試一試。官方網站:https://www.mysql.com/。
五、web server:jexus 5.8.3
咱們開發好的asp.net core mvc應用發佈後,須要一個web server提供運行環境,jexus就是linux下免費開源的asp.net web server。這裏無需對jexus多作介紹,詳細的內容能夠去官方網站:https://www.jexus.org/查詢。
怎麼安裝如上的環境,這裏限於篇幅,不重點介紹。相信讀者根據官方文檔(必定要仔細查閱)或者百度就能夠順利完成上述環境的準備。咱們這篇博客的目標就是在ubuntu下,使用vscode開發asp.net core應用,並經過ef core完成數據的持久化,數據庫使用免費開源跨平臺的mysql,最終將發佈好的asp.net core mvc應用在jexus裏承載,並讓jexus隨機啓動,這樣咱們一啓動好電腦,就能打開咱們的asp.net core mvc應用了。
關於本次項目案例,這裏我選擇一個現成的方案——參會報名應用,它來自於《Pro Entity Framework Core 2 for ASP.NET Core MVC》這本書,網上有免費電子英文版。這裏也順便推薦一下這本書,這本書的特色就是爲初學者準備了幾個簡要的開發案例,配備詳細的實現步驟和截圖,學習體驗很是好(這裏不得不佩服國外人寫的教程)。
2、使用vscode開發asp.net core應用
在ubuntu中,按ctrl+alt+t快捷鍵,打開控制檯,輸入dotnet --version命令,查看.net core版本,確保正確安裝。
而後咱們輸入dotnet new mvc命令,建立asp.net core mvc應用。
看到如上顯示的Restore succeeded即建立成功。
而後咱們使用vscode打開這個目錄,能夠看到以下圖所示的項目目錄結構。
若是有提示,要你安裝C#擴展,點擊Yes安裝便可。
從截圖能夠看到,經過vscode爲咱們展現的asp.net core mvc的項目結構很是清晰。Controller對應控制器,Models對應模型類,Views對應視圖,wwwroot存放一些靜態資源,包括js、css、img、lib(bootstrap、jquery)。幾個配置文件都是json格式的文件,熟悉json的也沒什麼問題。還有1個csproj文件,普通的C#項目都會有這個文件。還有兩個cs文件,分別爲Program.cs和Startup.cs,其中Program.cs中的Main方法是程序的運行入口,Startup.cs是項目啓動時的一些配置信息,好比添加mvc支持,路由的設置等等。
vscode中看到的asp.net net core應用就是一個完整可運行的版本。咱們在vscode中,打開Program.cs文件,在BuildwebHost方法中,加上一行代碼:
WebHost.CreateDefaultBuilder(args) .UseStartup<Startup>() .UseUrls(new string[]{"http://localhost:5001","http://localhost:5002"}) .Build();
而後在vscode界面下,按ctrl+f5快捷鍵(或者點擊vscode菜單欄中的Debug-Start Without Debugging)直接運行該項目,便可訪問咱們建立的asp.net core應用。
默認url是:localhost:5001,localhost:5002也能夠訪問,這就是咱們經過添加了UseUrls方法後所起到的做用。
此時的vscode狀態截圖以下:
咱們經過中間的導航欄能夠看到,此時的vscode處於運行狀態,咱們能夠經過快捷鍵shift+f5或者點擊紅色方塊按鈕,中止項目運行。
或者切換到asp.net core的項目目錄下,輸入dotnet run命令,啓動運行asp.net core項目。
3、添加EF Core
在vscode項目中使用EF Core鏈接mysql,須要添加引用Microsoft.EntityFrameworkCore和MySql.Data.EntityFrameworkCore包。
點擊菜單欄-View-Command Palette-Nuget Package Manager:Add Package,輸入Microsoft.EntityFrameworkCore,按回車。選擇版本,自動添加引用。
MySql.Data.EntityFrameworkCore包安裝方式也是同樣。安裝好以後vscode右下角會提示要Restore項目,點擊Restore便可。
這樣,咱們就能夠爲UseMySQL方法引入namespace了。
注意:關於該程序的具體代碼,這裏再也不詳細給出,本文最後會放出該項目的完整代碼。
開發完畢後,咱們能夠打開控制檯,切換到asp.net core的目錄下,用ef core命令生成數據庫。
輸入的命令爲:dotnet ef migrations add Initial,但卻發生以下的錯誤提示:
這個錯誤提示就是沒有找到匹配的dotnet ef命令。咱們打開項目的csproj文件,加入以下的配置信息。
<ItemGroup> <DotNetCliToolReference Include="Microsoft.EntityFrameworkCore.Tools" Version="2.0.0" /> <DotNetCliToolReference Include="Microsoft.EntityFrameworkCore.Tools.DotNet" Version="2.0.0" /> </ItemGroup>
編輯後的完整配置信息以下:
咱們在控制檯再次執行dotnet ef migrations add Initial命令。又出錯了,錯誤截圖以下:
錯誤提示信息:不能將concretetypemapping轉換爲relationaltypemapping類型。感受應該是Microsoft.EntityFrameworkCore的版本較高,API寫法進行了調整,須要寫新的類型轉換代碼。這個問題先放一放,後面有時間再研究一下。網上百度了一番,說是Microsoft.EntityFrameworkCore的版本太高,咱們用的是2.1.1版本,下降到2.0.2版本便可。
一樣的操做,vscode菜單欄-view-command palette-Nuget Package Manager:Add Package,輸入Microsoft.EntityFrameworkCore,按回車。選擇版本2.0.2版本,自動添加引用。最終修改後的csproj文件以下:
<Project Sdk="Microsoft.NET.Sdk.Web"> <PropertyGroup> <TargetFramework>netcoreapp2.0</TargetFramework> </PropertyGroup> <ItemGroup> <PackageReference Include="Microsoft.AspNetCore.All" Version="2.0.6"/> <PackageReference Include="Microsoft.EntityFrameworkCore" Version="2.0.2"/> <PackageReference Include="MySql.Data.EntityFrameworkCore" Version="8.0.11"/> </ItemGroup> <ItemGroup> <DotNetCliToolReference Include="Microsoft.VisualStudio.Web.CodeGeneration.Tools" Version="2.0.3"/> </ItemGroup> <ItemGroup> <DotNetCliToolReference Include="Microsoft.EntityFrameworkCore.Tools" Version="2.0.0"/> <DotNetCliToolReference Include="Microsoft.EntityFrameworkCore.Tools.DotNet" Version="2.0.0"/> </ItemGroup> </Project>
再次執行ef core遷移命令,此次終於成功了。
這時咱們回到vscode編輯器,看到項目中已經多了一個Migrations文件夾。
回到控制檯界面,輸入:dotnet ef database update命令。
能夠看到已經經過ef core成功的在mysql中建立了數據庫和表。咱們打開mysql workbench,看看數據庫test中的內容。
OK!至此開發方面的問題就都解決好了。只差最後一步,將咱們的項目發佈,並host在web server中了。
4、發佈、部署
發佈asp.net core mvc項目很簡單,經過publish命令就能夠了。咱們能夠先新建一個目錄,以便將文件發佈到該路徑。
發佈命令:dotnet publish -o /home/guwei4037/webapp,這樣就將項目發佈到了/home/guwei4037/webapp路徑中。
項目發佈完成以後,咱們須要將該項目部署到jexus中。
咱們將jexus放入到/usr/jexus目錄中。而後編輯/usr/jexus/siteconf裏的default文件內容。
###################### # Web Site: Default ######################################## port=80 root=/ /home/guwei4037/webapp # hosts=* #OR your.com,*.your.com # reproxy=/ http://localhost:5000/ # addr=0.0.0.0 # CheckQuery=false
NoLog=true AppHost={cmd=dotnet /home/guwei4037/webapp/firstcore.dll;root=/home/guwei4037/webapp;Port=5001,5002}
# NoFile=/index.php # Keep_Alive=false # UseGZIP=false # UseHttps=true # ssl.certificate=/x/xxx.crt #or pem # ssl.certificatekey=/x/xxx.key # ssl.protocol=TLSv1.0 # TLSv1.1 or TLSv1.2 # ssl.ciphers= # AppHost.Port=5000 # AppHost={cmd=dotnet /var/www/default/your.dll; root=/var/www/default; port=5000} # DenyFrom=192.168.i0.233, 192.168.1.*, 192.168.2.0/24 # AllowFrom=192.168.*.* # DenyDirs=~/cgi, ~/upfiles # indexes=myindex.aspx # rewrite=^/.+?\.(asp|php|cgi|pl|sh)$ /index.aspx # reproxy=/bbs/ http://192.168.1.112/bbs/ # host.Redirect=abc.com www.abc.com 301 # ResponseHandler.Add=myKey:myValue # Jexus php fastcgi address is '/var/run/jexus/phpsvr' ####################################################### # fastcgi.add=php|socket:/var/run/jexus/phpsvr # php-fpm listen address is '127.0.0.1:9000' ############################################ # fastcgi.add=php|tcp:127.0.0.1:9000
指定port端口號爲80端口,root爲/根目錄,後面的/home/guwei4037/webapp爲項目的發佈路徑,中間有1個空格隔開。NoLog=true意爲不記錄日誌,這樣網站訪問速度會比較快,缺點是沒有記錄日誌,遇到問題不能根據日誌信息很快定位。AppHost={cmd=dotnet /home/guwei4037/webapp/firstcore.dll;root=/home/guwei4037/webapp;port=5001,5002},其中cmd指定程序運行方式,後面的路徑爲啓動的文件,root爲根目錄,port配置支持多端口。
jexus配置好了,而且也從新啓動了。咱們就能夠打開localhost看看應用訪問是否正常。
能夠正常打開了。
趕忙使用一下里面的功能呢,都是OK的。
jexus已經成功的host了咱們的應用,那麼最後一步,如何讓jexus隨機啓動呢?在jexus的安裝配置要點(https://www.linuxdot.net/bbsfile-3084)裏面已經給出了答案:
開機自動啓動:
在/etc/rc.local 或類試的開機啓動腳本中加入下面這一行命令:
mono /usr/jexus/jws.exe >/dev/null 2>&1 &
或者
/usr/jexus/jws.start #推薦方式
因爲咱們引用了bootstrap,在ubuntu下用ifconfig命令查看一下本機的ip,而後用你的手機瀏覽器輸入這個ip就能夠在手機上面註冊參會了。
參考資料:
四、Table 'db.__EFMigrationsHistory' doesn't exist
五、Creating a Database with Code First in EF Core
項目源碼下載地址:
連接: https://pan.baidu.com/s/1buXY97zkvaMajFTYCOoc_Q 密碼: 4rpa