您好,登錄后才能下訂單哦!
這篇文章主要介紹“asp.net項目發(fā)布與部署的方法”的相關(guān)知識,小編通過實際案例向大家展示操作過程,操作方法簡單快捷,實用性強,希望這篇“asp.net項目發(fā)布與部署的方法”文章能幫助大家解決問題。
發(fā)布前的設(shè)置
由于新版ASP.NET5支持多版本DNX運行環(huán)境的發(fā)布和部署,所以在部署之前,我們需要設(shè)定部署的目標(biāo)DNX(即之前的KRE)。
步驟:右鍵BookStore項目->屬性->Application選項卡,選擇DNX的版本,本例中,選擇dnx-coreclr-win-x64.1.0.0-beta4。
在project.json文件的commands節(jié)點,我們可以看到,系統(tǒng)默認(rèn)配置了3個調(diào)試命令,分別如下:
命令 描述
web 啟動WebListener服務(wù),該服務(wù)可以讓web程序脫離IIS運行,默認(rèn)地址是http://localhost:5000。
gen 使用該命令可以生成MVC相關(guān)的代碼,比如Controller,目前還用不到。
ef Entity Framework遷移命令,用于遷移數(shù)據(jù)使用,本例我們還用戶不到。
理論上來說,我們F5運行的時候,應(yīng)該是啟動web命令,但是在VS2015中,默認(rèn)的運行環(huán)境依然是IIS Express,所以F5調(diào)試的時候,會默認(rèn)啟動IIS Express。
gen參考:http://www.cnblogs.com/dudu/p/aspnet5-k-gen.html
注意:web模式和IIS Express模式的程序運行端口不一樣。
我們先F5調(diào)試運行,啟動IIS Express,打開頁面,一切正常。重新選擇默認(rèn)模擬器環(huán)境為web,再F5運行,這時候發(fā)現(xiàn)彈出了一個命令行窗口,并提示如下文字:
[INFORMATION:Microsoft.NET.Http.Server.WebListener] Start [INFORMATION:Microsoft.NET.Http.Server.WebListener] Listening on prefix: http://localhost:5000/ Started
代碼沒有出錯,但是并沒有打開瀏覽器窗口,我們手工打開一個瀏覽器訪問上述網(wǎng)址,即可看到該示例程序的界面,此時說明,該BookStore已經(jīng)成功運行在5000端口了。其實該模式下的瀏覽器自動打開功能默認(rèn)是關(guān)閉的,可以通過如下方式開啟自動打開功能:
步驟:右鍵BookStore項目->屬性->Debug選項卡,勾選Launch Brower復(fù)選框,并在輸入框里輸入上述網(wǎng)址即可(此時會在項目的Properties目錄下生成一個debugSettings.json文件來保存上述信息)。
再次F5運行,即可看到自動打開的瀏覽器界面。
應(yīng)用程序參數(shù)
在該Debug選項卡中,我們還看到一個應(yīng)用程序參數(shù)(Application Arguments)輸入框,該輸入框可以傳入多種參數(shù),這些參數(shù)可以在Startup.cs里,通過Configuration的AddCommandLine方法進行收集并利用。
環(huán)境變量
同理,在Debug選項卡的最下面還有一個環(huán)境變量(Environment Variables)輸入框,可以讓我們在調(diào)試的時候自定義一些環(huán)境變量的值(key/value),然后通過Configuration的AddEnvironmentVariables方法進行收集并利用。
上述參數(shù)和環(huán)境變量的具體使用方式,請參考配置信息管理章節(jié)。
發(fā)布流程分析
在之前的MVC程序中,我們一般都是通過右鍵項目,選擇發(fā)布(Publish)的方式來發(fā)布程序的,這一次我們也來看看這種方式。
首先,右鍵->發(fā)布->Profile(選擇File System)->選擇D:\BookStore->選擇Release/coreclr->下一步,最終點擊發(fā)布。在在Output面板,我們看到出錯了,錯誤信息如下:
正在連接到 D:\Documents\Visual Studio 2015\Projects\BookStore\BookStore\..\artifacts\bin\BookStore\Release\Publish... C:\Program Files (x86)\MSBuild\Microsoft\VisualStudio\v14.0\Web\Microsoft.DNX.Publishing.targets(342,5): 錯誤 : 錯誤: 無法識別規(guī)則“BackupRule”。 C:\Program Files (x86)\MSBuild\Microsoft\VisualStudio\v14.0\Web\Microsoft.DNX.Publishing.targets(342,5): 錯誤 : 錯誤計數(shù): 1。 C:\Program Files (x86)\MSBuild\Microsoft\VisualStudio\v14.0\Web\Microsoft.DNX.Publishing.targets(342,5): 錯誤 : An error occured during publish. The command ["C:\Program Files (x86)\IIS\Microsoft Web Deploy\msdeploy.exe" -source:contentPath='C:\Users\Administrator\AppData\Local\Temp\PublishTemp\' -dest:contentPath='D:\Documents\Visual Studio 2015\Projects\BookStore\artifacts\bin\BookStore\Release\Publish' -verb:sync -enableRule:DoNotDeleteRule -retryAttempts:2 -disablerule:BackupRule ] exited with code [-1]。
通過查看輸出信息,可以發(fā)現(xiàn),編譯成功,但復(fù)制的時候出錯,可能是powershell的問題,所以返回上述步驟,在設(shè)置(Settings)選項卡下,將取消發(fā)布腳本(Publish Scripts)下的使用PowerShell腳本發(fā)布的復(fù)選框。重新發(fā)布,成功了。
打開發(fā)布目錄D:\BookStore,發(fā)現(xiàn)生成了如下目錄和文件:
目錄或文件 描述
approot 應(yīng)用程序目錄
wwwroot 靜態(tài)文件目錄
gen linux shell 命令文件
gen.cmd cmd 命令文件
web linux shell 命令文件
web.cmd cmd 命令文件
看到cmd文件的擴展名,我們可以猜想這些命令是用于執(zhí)行相關(guān)的命令,比如web.cmd可能就是用于啟動程序的;而非cmd擴展名文件,我們則猜想可能是用于linux/mac運行的命令。
我們來試一下,點擊web.cmd文件,該文件執(zhí)行以后顯示的信息和我們在Debug程序時彈出的信息一樣,通過訪問提示中的網(wǎng)址,我們可以驗證應(yīng)用程序已經(jīng)正常運行了。這種模式即時我們所說的自宿主(Self-Host)運行模式。
再試一下IIS是否能夠運行該程序,將IIS站點指向到wwwroot目錄,打開網(wǎng)址,也是可以正常訪問的。打開wwwroot文件夾進行查看,靜態(tài)文件一應(yīng)俱全,但是發(fā)現(xiàn)bin目錄下并沒有我們的項目DLL(BookStore.dll),而是多了一個AspNet.Loader.dll,而且根目錄下還多了一個web.config文件,內(nèi)容如下:
<?xml version="1.0" encoding="utf-8"?> <configuration> <appSettings> <add key="bootstrapper-version" value="1.0.0-beta4" /> <add key="runtime-path" value="..\approot\packages" /> <add key="dnx-version" value="1.0.0-beta4" /> <add key="dnx-clr" value="coreclr" /> <add key="dnx-app-base" value="..\approot\src\BookStore" /> </appSettings> </configuration>
通過查詢相關(guān)信息(訪問詳情) ,得知AspNet.Loader.dll文件只是一個橋接文件,用于接收IIS轉(zhuǎn)發(fā)過來的請求,然后將其轉(zhuǎn)交給dnx進行運行,這里的web.config里的dnx以及項目信息的配置文件是AspNet.Loader.dll在轉(zhuǎn)交請求時所需要的配置信息。
通過配置文件我們可以看到,這里配置了dnx的類型、版本號,程序集的路徑和app的路徑。打開approot\src\BookStore目錄,我們發(fā)現(xiàn),這里居然都是cs源碼,雖然有個bin目錄,但是里面也沒有dll文件。而且在approot\packages文件夾下,居然有90個程序集文件夾(將近30M文件)。
通過查詢網(wǎng)站的資料得知(這一部分內(nèi)容,我們在下一節(jié)進行講解),目前真正運行程序的運行環(huán)境是DNX,也被復(fù)制到approot\packages\dnx-coreclr-win-x64.1.0.0-beta4目錄中, 而該項目依賴的所有程序集(包括System開頭的)都被復(fù)制到該packages目錄下了。目的就是要做到真正的跨平臺運行,也就是說,將這些文件復(fù)制到linux系統(tǒng)下,只要有對應(yīng)版本的KRE(本例中的DNX是Windows版本的)的話,就可以正常運行該程序。
而bin目錄下沒有dll文件,則是使用了微軟***的動態(tài)編譯技術(shù),即在運行的過程中,自動編譯cs文件,而且一旦修改這些cs文件的話,系統(tǒng)將會自動再次進行編譯。(感覺有點像php等腳本語言了)。雖然動態(tài)編譯很高效,但是還是沒有編譯好的dll高效,所以微軟還提供了一個選項讓開發(fā)人員在調(diào)試的時候生成dll文件。具體步驟如下:
右鍵BookStore->屬性->Build選項卡,勾選編譯時生成輸出(Produce outputs on build)復(fù)選框。
重新編譯程序,發(fā)現(xiàn)在BookStore\artifacts\bin\BookStore\Debug目錄下的2個DNX版本文件夾下都分別生成了BookStore.dll文件了,而且還順帶了Nuget的spec文件。
如果在發(fā)布的時候也要生成dll文件,則需要在發(fā)布(Publish)設(shè)置里進行修改,步驟如下:
右鍵BookStore->發(fā)布(Publish)->Settings選項卡->File Publish Options->勾選Precompile during publishing復(fù)選框。
這樣就可以生成響應(yīng)的dll文件, 但是這些dll文件依然不在wwwroot/bin目錄下,而是在approot\packages\BookStore\1.0.0目錄下,在該目錄下有2個文件夾,分別是lib和root,以及相關(guān)的Nuget的spec文件,在lib目錄下,生成的是不同dnx版本的dll文件,而root則是類似于之前的web根目錄,因為在該目錄下除了有視圖文件以外,還和以前的結(jié)構(gòu)一樣,保留了bin目錄,并且在bin目錄下的Release文件夾下,也有一份針對不同dnx版本的dll文件副本。
提示:上述選擇中,另外一個Delete all existing files prior to publish也可以勾選上,以便在發(fā)布時將之前發(fā)布版本的所有文件全部清空。
此時,我們通過web.cmd文件或者IIS模式來驗證發(fā)布的文件,經(jīng)驗證,均可以正常運行。再仔細(xì)對比兩份不同設(shè)在的發(fā)布文件,發(fā)現(xiàn),除了dll文件以外,web.config文件的應(yīng)用程序路徑也變了,即從原來的:
<add key="kre-app-base" value="..\approot\src\BookStore" />
變成了如下版本:
<add key="kre-app-base" value="..\approot\packages\BookStore\1.0.0\root" />
而web.cmd文件的內(nèi)容,也從如下內(nèi)容:
@"%~dp0approot\packages\dnx-coreclr-win-x64.1.0.0-beta4\bin\dnx.exe" --appbase "%~dp0approot\src\BookStore" Microsoft.Framework.ApplicationHost web %*
變成了如下內(nèi)容:
@"%~dp0approot\packages\kre-coreclr-win-x64.1.0.0-beta4\bin\dnx.exe" --appbase "%~dp0approot\packages\BookStore\1.0.0\root" Microsoft.Framework.ApplicationHost web %*
上述變化,我們是可以理解的,即將src源碼動態(tài)編譯運行的模式修改為預(yù)編譯dll程序集的模式。所以,在這里我們可以看到,在源碼動態(tài)編譯模式下,其發(fā)布后的文件夾結(jié)構(gòu)如下:
//源碼動態(tài)編譯模式
wwwroot/bin/Microsoft.AspNet.Loader.IIS.dll wwwroot/Contents/site.css wwwroot/Contents/....................................... ........................................................ wwwroot/Scripts/jquery.js wwwroot/Scripts/........................................ ........................................................ ........................................................ approot/src/BootStore/project.json approot/src/BootStore/............................... approot/src/BootStore.Data/project.json approot/src/BootStore.Data/.............................. approot/src/BootStore.Bussiness/project.json approot/src/BootStore.Bussiness/......................... approot/packages/Elmah/{version}/....................... ........................................................ 而dll預(yù)編譯模式下的發(fā)布文件夾結(jié)構(gòu)如下: //dll預(yù)編譯模式 wwwroot/bin/Microsoft.AspNet.Loader.IIS.dll wwwroot/Contents/site.css wwwroot/Contents/....................................... ........................................................ wwwroot/Scripts/jquery.js wwwroot/Scripts/........................................ ........................................................ ........................................................ approot/packages/BootStore/{version}/................... approot/packages/BootStore.Data/{version}/.............. approot/packages/BootStore.Bussiness/{version}/......... approot/packages/Elmah/{version}/.......................
IIS和web.cmd模式的不同
雖然我們對dnx內(nèi)容的原理不太理解,但有一點內(nèi)容,我們要記住,那就是兩種模式下,對靜態(tài)文件的訪問模式可能不太一樣。原因是因為,雖然IIS模式的根目錄就是存放靜態(tài)文件的地方,但是web.cmd文件事先啟動的卻是approot\src\BookStore目錄或approot\packages\BookStore\1.0.0\root目錄,兩個目錄下均沒有靜態(tài)文件,因為靜態(tài)文件時在wwwroot目錄下的,我們猜想,在這種模式下,肯定會有一種機制在來映射這些靜態(tài)文件,通過查找文件發(fā)現(xiàn),在approot\src\BookStore目錄下的project.json文件中的webroot鍵的值,從解決方案中默認(rèn)的wwwroot變成了"../../../wwwroot",也就是說kre在映射靜態(tài)文件的時候,應(yīng)該是根據(jù)這個相對目錄來查找這些文件的。
同理,approot\packages\BookStore\1.0.0\root目錄下的project.json文件中的webroot鍵的值,也從wwwroot變成了"../../../../../wwwroot"(因為本來project.json文件的層級就深)。
由于IIS是通過AspNet.Loader.dll做中轉(zhuǎn),將請求轉(zhuǎn)交給DNX來運行的,那么在IIS模式下,靜態(tài)文件的請求到底是IIS來處理,還是KRE來處理呢?我們來驗證一下,驗證步驟如下:
創(chuàng)建一個wwwroot2文件夾和wwwroot同級,并將wwwrooot目錄下的靜態(tài)文件剪切到wwwroot2目錄下。
將project.json(如果是預(yù)編譯模式,則需要修改root目錄下的project.json)文件中的webroot值中的wwwroot修改為wwwroot2。
繼續(xù)以IIS模式運行該站點
結(jié)果發(fā)現(xiàn),靜態(tài)文件訪問不了了(CSS、JS、Images均失效了),但我們再通過web.cmd運行時,這些靜態(tài)文件卻又可以訪問了。由此得知,在IIS模式下,靜態(tài)文件走的是IIS的管線Pipeline,而不是DNX的關(guān)系Pipeline。
兩種發(fā)布模式下的project.json文件不同
動態(tài)編譯模式和預(yù)編譯dll模式這兩種模式的自動發(fā)布程序,生成后的project.json文件有一些變化,具體變化如下。
動態(tài)編譯模式
基本上和解決方案里的project.json文件相同,唯一的不同就是webroot的相對路徑的修改。
預(yù)編譯dll模式
原來引用的眾多程序集從dependencies節(jié)點中移除了,取而代之的是BookStore程序集引用,示例如下:
"dependencies": { "BookStore": "1.0.0" },
另外,還多了如下兩個節(jié)點值(具體功能暫不明確):
"entryPoint": "BookStore", "loadable": false
猜想,這些不同,可能是因為在動態(tài)編譯模式下需要引用這些被移除的程序集進行編譯,而預(yù)編譯dll模式下,都已經(jīng)編譯好了,所以就不再需要這些程序集了,而root目錄只需要引用BookStore程序集就可以了,而BookStore程序集對這些程序集的依賴,詳細(xì)在該dll程序集的nupkg文件里是可以自動解析并下載的吧(這一點待驗證)。
關(guān)于“asp.net項目發(fā)布與部署的方法”的內(nèi)容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業(yè)相關(guān)的知識,可以關(guān)注億速云行業(yè)資訊頻道,小編每天都會為大家更新不同的知識點。
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。