• <fieldset id="8imwq"><menu id="8imwq"></menu></fieldset>
  • <bdo id="8imwq"><input id="8imwq"></input></bdo>
    最新文章專題視頻專題問答1問答10問答100問答1000問答2000關(guān)鍵字專題1關(guān)鍵字專題50關(guān)鍵字專題500關(guān)鍵字專題1500TAG最新視頻文章推薦1 推薦3 推薦5 推薦7 推薦9 推薦11 推薦13 推薦15 推薦17 推薦19 推薦21 推薦23 推薦25 推薦27 推薦29 推薦31 推薦33 推薦35 推薦37視頻文章20視頻文章30視頻文章40視頻文章50視頻文章60 視頻文章70視頻文章80視頻文章90視頻文章100視頻文章120視頻文章140 視頻2關(guān)鍵字專題關(guān)鍵字專題tag2tag3文章專題文章專題2文章索引1文章索引2文章索引3文章索引4文章索引5123456789101112131415文章專題3
    問答文章1 問答文章501 問答文章1001 問答文章1501 問答文章2001 問答文章2501 問答文章3001 問答文章3501 問答文章4001 問答文章4501 問答文章5001 問答文章5501 問答文章6001 問答文章6501 問答文章7001 問答文章7501 問答文章8001 問答文章8501 問答文章9001 問答文章9501
    當(dāng)前位置: 首頁(yè) - 科技 - 知識(shí)百科 - 正文

    解讀ASP.NET 5 & MVC6系列教程(3):項(xiàng)目發(fā)布與部署

    來源:懂視網(wǎng) 責(zé)編:小采 時(shí)間:2020-11-27 22:36:59
    文檔

    解讀ASP.NET 5 & MVC6系列教程(3):項(xiàng)目發(fā)布與部署

    解讀ASP.NET 5 & MVC6系列教程(3):項(xiàng)目發(fā)布與部署:本章我們將講解ASP.NET5項(xiàng)目發(fā)布部署相關(guān)的內(nèi)容,示例項(xiàng)目以我們前一章創(chuàng)建的BookStore項(xiàng)目為例。 發(fā)布前的設(shè)置 由于新版ASP.NET5支持多版本DNX運(yùn)行環(huán)境的發(fā)布和部署,所以在部署之前,我們需要設(shè)定部署的目標(biāo)DNX(即之前的KRE)。 步驟:右鍵BookS
    推薦度:
    導(dǎo)讀解讀ASP.NET 5 & MVC6系列教程(3):項(xiàng)目發(fā)布與部署:本章我們將講解ASP.NET5項(xiàng)目發(fā)布部署相關(guān)的內(nèi)容,示例項(xiàng)目以我們前一章創(chuàng)建的BookStore項(xiàng)目為例。 發(fā)布前的設(shè)置 由于新版ASP.NET5支持多版本DNX運(yùn)行環(huán)境的發(fā)布和部署,所以在部署之前,我們需要設(shè)定部署的目標(biāo)DNX(即之前的KRE)。 步驟:右鍵BookS

    本章我們將講解ASP.NET5項(xiàng)目發(fā)布部署相關(guān)的內(nèi)容,示例項(xiàng)目以我們前一章創(chuàng)建的BookStore項(xiàng)目為例。

    發(fā)布前的設(shè)置

    由于新版ASP.NET5支持多版本DNX運(yùn)行環(huán)境的發(fā)布和部署,所以在部署之前,我們需要設(shè)定部署的目標(biāo)DNX(即之前的KRE)。

    步驟:右鍵BookStore項(xiàng)目->屬性->Application選項(xiàng)卡,選擇DNX的版本,本例中,選擇dnx-coreclr-win-x64.1.0.0-beta4。

    project.json文件的commands節(jié)點(diǎn),我們可以看到,系統(tǒng)默認(rèn)配置了3個(gè)調(diào)試命令,分別如下:

    命令 描述
    web 啟動(dòng)WebListener服務(wù),該服務(wù)可以讓web程序脫離IIS運(yùn)行,默認(rèn)地址是http://localhost:5000。
    gen 使用該命令可以生成MVC相關(guān)的代碼,比如Controller,目前還用不到。
    ef Entity Framework遷移命令,用于遷移數(shù)據(jù)使用,本例我們還用戶不到。

    理論上來說,我們F5運(yùn)行的時(shí)候,應(yīng)該是啟動(dòng)web命令,但是在VS2015中,默認(rèn)的運(yùn)行環(huán)境依然是IIS Express,所以F5調(diào)試的時(shí)候,會(huì)默認(rèn)啟動(dòng)IIS Express。

    gen參考://www.gxlcms.com/article/87244.htm
    注意:web模式和IIS Express模式的程序運(yùn)行端口不一樣。

    我們先F5調(diào)試運(yùn)行,啟動(dòng)IIS Express,打開頁(yè)面,一切正常。重新選擇默認(rèn)模擬器環(huán)境為web,再F5運(yùn)行,這時(shí)候發(fā)現(xiàn)彈出了一個(gè)命令行窗口,并提示如下文字:

    [INFORMATION:Microsoft.NET.Http.Server.WebListener] Start
    [INFORMATION:Microsoft.NET.Http.Server.WebListener] Listening on prefix: http://localhost:5000/
    Started

    代碼沒有出錯(cuò),但是并沒有打開瀏覽器窗口,我們手工打開一個(gè)瀏覽器訪問上述網(wǎng)址,即可看到該示例程序的界面,此時(shí)說明,該BookStore已經(jīng)成功運(yùn)行在5000端口了。其實(shí)該模式下的瀏覽器自動(dòng)打開功能默認(rèn)是關(guān)閉的,可以通過如下方式開啟自動(dòng)打開功能:

    步驟:右鍵BookStore項(xiàng)目->屬性->Debug選項(xiàng)卡,勾選Launch Brower復(fù)選框,并在輸入框里輸入上述網(wǎng)址即可(此時(shí)會(huì)在項(xiàng)目的Properties目錄下生成一個(gè)debugSettings.json文件來保存上述信息)。

    再次F5運(yùn)行,即可看到自動(dòng)打開的瀏覽器界面。

    應(yīng)用程序參數(shù)
    在該Debug選項(xiàng)卡中,我們還看到一個(gè)應(yīng)用程序參數(shù)(Application Arguments)輸入框,該輸入框可以傳入多種參數(shù),這些參數(shù)可以在Startup.cs里,通過ConfigurationAddCommandLine方法進(jìn)行收集并利用。

    環(huán)境變量
    同理,在Debug選項(xiàng)卡的最下面還有一個(gè)環(huán)境變量(Environment Variables)輸入框,可以讓我們?cè)谡{(diào)試的時(shí)候自定義一些環(huán)境變量的值(key/value),然后通過ConfigurationAddEnvironmentVariables方法進(jìn)行收集并利用。

    上述參數(shù)和環(huán)境變量的具體使用方式,請(qǐng)參考配置信息管理章節(jié)。

    發(fā)布流程分析

    在之前的MVC程序中,我們一般都是通過右鍵項(xiàng)目,選擇發(fā)布(Publish)的方式來發(fā)布程序的,這一次我們也來看看這種方式。

    首先,右鍵->發(fā)布->Profile(選擇File System)->選擇D:\BookStore->選擇Release/coreclr->下一步,最終點(diǎn)擊發(fā)布。在在Output面板,我們看到出錯(cuò)了,錯(cuò)誤信息如下:

    正在連接到 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): 錯(cuò)誤 : 錯(cuò)誤: 無法識(shí)別規(guī)則“BackupRule”。
    C:\Program Files (x86)\MSBuild\Microsoft\VisualStudio\v14.0\Web\Microsoft.DNX.Publishing.targets(342,5): 錯(cuò)誤 : 錯(cuò)誤計(jì)數(shù): 1。
    
    C:\Program Files (x86)\MSBuild\Microsoft\VisualStudio\v14.0\Web\Microsoft.DNX.Publishing.targets(342,5): 錯(cuò)誤 : 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ù)制的時(shí)候出錯(cuò),可能是powershell的問題,所以返回上述步驟,在設(shè)置(Settings)選項(xiàng)卡下,將取消發(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文件的擴(kuò)展名,我們可以猜想這些命令是用于執(zhí)行相關(guān)的命令,比如web.cmd可能就是用于啟動(dòng)程序的;而非cmd擴(kuò)展名文件,我們則猜想可能是用于linux/mac運(yùn)行的命令。

    我們來試一下,點(diǎn)擊web.cmd文件,該文件執(zhí)行以后顯示的信息和我們?cè)贒ebug程序時(shí)彈出的信息一樣,通過訪問提示中的網(wǎng)址,我們可以驗(yàn)證應(yīng)用程序已經(jīng)正常運(yùn)行了。這種模式即時(shí)我們所說的自宿主(Self-Host)運(yùn)行模式。

    再試一下IIS是否能夠運(yùn)行該程序,將IIS站點(diǎn)指向到wwwroot目錄,打開網(wǎng)址,也是可以正常訪問的。打開wwwroot文件夾進(jìn)行查看,靜態(tài)文件一應(yīng)俱全,但是發(fā)現(xiàn)bin目錄下并沒有我們的項(xiàng)目DLL(BookStore.dll),而是多了一個(gè)AspNet.Loader.dll,而且根目錄下還多了一個(gè)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文件只是一個(gè)橋接文件,用于接收IIS轉(zhuǎn)發(fā)過來的請(qǐng)求,然后將其轉(zhuǎn)交給dnx進(jìn)行運(yùn)行,這里的web.config里的dnx以及項(xiàng)目信息的配置文件是AspNet.Loader.dll在轉(zhuǎn)交請(qǐng)求時(shí)所需要的配置信息。

    通過配置文件我們可以看到,這里配置了dnx的類型、版本號(hào),程序集的路徑和app的路徑。打開approot\src\BookStore目錄,我們發(fā)現(xiàn),這里居然都是cs源碼,雖然有個(gè)bin目錄,但是里面也沒有dll文件。而且在approot\packages文件夾下,居然有90個(gè)程序集文件夾(將近30M文件)。

    通過查詢網(wǎng)站的資料得知(這一部分內(nèi)容,我們?cè)谙乱还?jié)進(jìn)行講解),目前真正運(yùn)行程序的運(yùn)行環(huán)境是DNX,也被復(fù)制到approot\packages\dnx-coreclr-win-x64.1.0.0-beta4目錄中, 而該項(xiàng)目依賴的所有程序集(包括System開頭的)都被復(fù)制到該packages目錄下了。目的就是要做到真正的跨平臺(tái)運(yùn)行,也就是說,將這些文件復(fù)制到linux系統(tǒng)下,只要有對(duì)應(yīng)版本的KRE(本例中的DNX是Windows版本的)的話,就可以正常運(yùn)行該程序。

    而bin目錄下沒有dll文件,則是使用了微軟最新的動(dòng)態(tài)編譯技術(shù),即在運(yùn)行的過程中,自動(dòng)編譯cs文件,而且一旦修改這些cs文件的話,系統(tǒng)將會(huì)自動(dòng)再次進(jìn)行編譯。(感覺有點(diǎn)像php等腳本語言了)。雖然動(dòng)態(tài)編譯很高效,但是還是沒有編譯好的dll高效,所以微軟還提供了一個(gè)選項(xiàng)讓開發(fā)人員在調(diào)試的時(shí)候生成dll文件。具體步驟如下:

    右鍵BookStore->屬性->Build選項(xiàng)卡,勾選編譯時(shí)生成輸出(Produce outputs on build)復(fù)選框。

    重新編譯程序,發(fā)現(xiàn)在BookStore\artifacts\bin\BookStore\Debug目錄下的2個(gè)DNX版本文件夾下都分別生成了BookStore.dll文件了,而且還順帶了Nuget的spec文件。

    如果在發(fā)布的時(shí)候也要生成dll文件,則需要在發(fā)布(Publish)設(shè)置里進(jìn)行修改,步驟如下:

    右鍵BookStore->發(fā)布(Publish)->Settings選項(xiàng)卡->File Publish Options->勾選Precompile during publishing復(fù)選框。

    這樣就可以生成響應(yīng)的dll文件, 但是這些dll文件依然不在wwwroot/bin目錄下,而是在approot\packages\BookStore\1.0.0目錄下,在該目錄下有2個(gè)文件夾,分別是libroot,以及相關(guān)的Nuget的spec文件,在lib目錄下,生成的是不同dnx版本的dll文件,而root則是類似于之前的web根目錄,因?yàn)樵谠撃夸浵鲁擞幸晥D文件以外,還和以前的結(jié)構(gòu)一樣,保留了bin目錄,并且在bin目錄下的Release文件夾下,也有一份針對(duì)不同dnx版本的dll文件副本。

    提示:上述選擇中,另外一個(gè)Delete all existing files prior to publish也可以勾選上,以便在發(fā)布時(shí)將之前發(fā)布版本的所有文件全部清空。

    此時(shí),我們通過web.cmd文件或者IIS模式來驗(yàn)證發(fā)布的文件,經(jīng)驗(yàn)證,均可以正常運(yùn)行。再仔細(xì)對(duì)比兩份不同設(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源碼動(dòng)態(tài)編譯運(yùn)行的模式修改為預(yù)編譯dll程序集的模式。所以,在這里我們可以看到,在源碼動(dòng)態(tài)編譯模式下,其發(fā)布后的文件夾結(jié)構(gòu)如下:

    //源碼動(dòng)態(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模式的不同

    雖然我們對(duì)dnx內(nèi)容的原理不太理解,但有一點(diǎn)內(nèi)容,我們要記住,那就是兩種模式下,對(duì)靜態(tài)文件的訪問模式可能不太一樣。原因是因?yàn)?,雖然IIS模式的根目錄就是存放靜態(tài)文件的地方,但是web.cmd文件事先啟動(dòng)的卻是approot\src\BookStore目錄或approot\packages\BookStore\1.0.0\root目錄,兩個(gè)目錄下均沒有靜態(tài)文件,因?yàn)殪o態(tài)文件時(shí)在wwwroot目錄下的,我們猜想,在這種模式下,肯定會(huì)有一種機(jī)制在來映射這些靜態(tài)文件,通過查找文件發(fā)現(xiàn),在approot\src\BookStore目錄下的project.json文件中的webroot鍵的值,從解決方案中默認(rèn)的wwwroot變成了"../../../wwwroot",也就是說kre在映射靜態(tài)文件的時(shí)候,應(yīng)該是根據(jù)這個(gè)相對(duì)目錄來查找這些文件的。

    同理,approot\packages\BookStore\1.0.0\root目錄下的project.json文件中的webroot鍵的值,也從wwwroot變成了"../../../../../wwwroot"(因?yàn)楸緛?code>project.json文件的層級(jí)就深)。

    由于IIS是通過AspNet.Loader.dll做中轉(zhuǎn),將請(qǐng)求轉(zhuǎn)交給DNX來運(yùn)行的,那么在IIS模式下,靜態(tài)文件的請(qǐng)求到底是IIS來處理,還是KRE來處理呢?我們來驗(yàn)證一下,驗(yàn)證步驟如下:

    創(chuàng)建一個(gè)wwwroot2文件夾和wwwroot同級(jí),并將wwwrooot目錄下的靜態(tài)文件剪切到wwwroot2目錄下。將project.json(如果是預(yù)編譯模式,則需要修改root目錄下的project.json)文件中的webroot值中的wwwroot修改為wwwroot2。繼續(xù)以IIS模式運(yùn)行該站點(diǎn)

    結(jié)果發(fā)現(xiàn),靜態(tài)文件訪問不了了(CSS、JS、Images均失效了),但我們?cè)偻ㄟ^web.cmd運(yùn)行時(shí),這些靜態(tài)文件卻又可以訪問了。由此得知,在IIS模式下,靜態(tài)文件走的是IIS的管線Pipeline,而不是DNX的關(guān)系Pipeline。

    兩種發(fā)布模式下的project.json文件不同

    動(dòng)態(tài)編譯模式和預(yù)編譯dll模式這兩種模式的自動(dòng)發(fā)布程序,生成后的project.json文件有一些變化,具體變化如下。

    動(dòng)態(tài)編譯模式
    基本上和解決方案里的project.json文件相同,唯一的不同就是webroot的相對(duì)路徑的修改。

    預(yù)編譯dll模式
    原來引用的眾多程序集從dependencies節(jié)點(diǎn)中移除了,取而代之的是BookStore程序集引用,示例如下:

    "dependencies": {
     "BookStore": "1.0.0"
    },

    另外,還多了如下兩個(gè)節(jié)點(diǎn)值(具體功能暫不明確):

    "entryPoint": "BookStore",
    "loadable": false

    猜想,這些不同,可能是因?yàn)樵趧?dòng)態(tài)編譯模式下需要引用這些被移除的程序集進(jìn)行編譯,而預(yù)編譯dll模式下,都已經(jīng)編譯好了,所以就不再需要這些程序集了,而root目錄只需要引用BookStore程序集就可以了,而BookStore程序集對(duì)這些程序集的依賴,詳細(xì)在該dll程序集的nupkg文件里是可以自動(dòng)解析并下載的吧(這一點(diǎn)待驗(yàn)證)。

    以上是新版ASP.NET5項(xiàng)目在發(fā)布流程和相關(guān)技術(shù)的一些內(nèi)容,從這里大家可以看到,ASP.NET5是徹底模塊化了,IIS不再是運(yùn)行MVC程序的唯一容器,任何兼容DNX的運(yùn)行容器都可以運(yùn)行MVC程序,程序發(fā)布包被分為approot和wwwroot兩個(gè)部分,分別存放應(yīng)用程序集(或源碼)和靜態(tài)文件,從而做到更好的分離。在下一章,我們會(huì)討論,ASP.NET 5的運(yùn)行原理。

    注意:目前還沒有辦法通過復(fù)制源碼的形式來進(jìn)行調(diào)試,同時(shí)也沒辦法將IIS指向到源碼中進(jìn)行調(diào)試,這將會(huì)改變開發(fā)人員的開發(fā)習(xí)慣。

    聲明:本網(wǎng)頁(yè)內(nèi)容旨在傳播知識(shí),若有侵權(quán)等問題請(qǐng)及時(shí)與本網(wǎng)聯(lián)系,我們將在第一時(shí)間刪除處理。TEL:177 7030 7066 E-MAIL:11247931@qq.com

    文檔

    解讀ASP.NET 5 & MVC6系列教程(3):項(xiàng)目發(fā)布與部署

    解讀ASP.NET 5 & MVC6系列教程(3):項(xiàng)目發(fā)布與部署:本章我們將講解ASP.NET5項(xiàng)目發(fā)布部署相關(guān)的內(nèi)容,示例項(xiàng)目以我們前一章創(chuàng)建的BookStore項(xiàng)目為例。 發(fā)布前的設(shè)置 由于新版ASP.NET5支持多版本DNX運(yùn)行環(huán)境的發(fā)布和部署,所以在部署之前,我們需要設(shè)定部署的目標(biāo)DNX(即之前的KRE)。 步驟:右鍵BookS
    推薦度:
    標(biāo)簽: 項(xiàng)目 部署 &amp;
    • 熱門焦點(diǎn)

    最新推薦

    猜你喜歡

    熱門推薦

    專題
    Top
    主站蜘蛛池模板: 无码国产精品一区二区免费16| 中文字幕精品久久久久人妻| 日本精品一区二区三区在线视频一| 日韩精品无码一区二区三区 | 日韩一区二区精品观看| 999国内精品永久免费观看| 亚洲综合国产精品第一页| 精品国产一区二区三区在线观看| 欧美日韩在线亚洲国产精品| 国产办公室秘书无码精品99| 久久精品夜夜夜夜夜久久| 亚洲情侣偷拍精品| 亚洲精品WWW久久久久久| 午夜在线视频91精品 | 国产精品欧美亚洲韩国日本| 精品少妇人妻av无码久久| 久久夜色精品国产网站| 亚洲动漫精品无码av天堂| 亚洲а∨天堂久久精品9966| 久久久久国产成人精品亚洲午夜| 国产在线91精品入口| 国产精品亚洲视频| 国产一级精品高清一级毛片| 国产啪亚洲国产精品无码| 国产精品亚洲综合专区片高清久久久| 亚洲永久永久永久永久永久精品| 亚洲国产精品嫩草影院| 99热精品久久只有精品| 777国产盗摄偷窥精品0OOO| 久久久久四虎国产精品| 1区1区3区4区产品芒果精品| 91精品日韩人妻无码久久不卡| 成人国产精品秘 果冻传媒在线 | 国产夫妇精品自在线| 欧美精品免费在线| 国产A∨免费精品视频| 国产精品亚洲视频| 亚洲第一永久AV网站久久精品男人的天堂AV| 热综合一本伊人久久精品| 一本久久a久久精品综合香蕉| 日韩精品国产另类专区|