1. 程式人生 > >asp.net core的基本部署

asp.net core的基本部署

生成 values web應用 -1 work 什麽 spn 中間件 服務器

隨著.net core正式版的推出,我也準備開始使用這種微軟有史以來第一次跨平臺的技術(本人從來不學也不看beta版的技術),使用VS2017新建一個.net core的web應用程序

技術分享

這裏隨便選什麽都可以,其實創建出來的都一樣,在core中,MVC和WebApi的管道已經統一,所以在類庫中已經不會再出現API字眼(雖然實際上,現在MVC早已沒人用了)的類了,

建完以後,大概長這樣

技術分享

忽略host.json,那個是我自己加的,打開program,可以發現,web應用程序本質上就是一個控制臺程序,

技術分享

請再次忽略InitConfigurationContainer方法,這個也是我自己加的,後面的文章會講到。

所以,請記住,.net core從來就沒有所謂的web應用程序,所有程序的入口點都是暴露在外面的,以靜態方法Main作為入口函數,所謂asp.net core,也是在這個函數中建立了一個WebHost來執行web的監聽與處理。這就是為什麽說,asp.net core與IIS沒有任何關系了

先簡單講一下,這段代碼中WebHost通過UseStartup將啟動類指定到了Startup類(其實也可以不指定,WebHost會根據一些規則自己去找,這個以後再講),在WebHost執行Run方法後,就會去執行Startup,這裏,還看到有一個叫UseIIIntegration的方法,調用這個方法後,就可以讓IIS充當對外的web接收者(反向代理),將請求轉給.net core程序處理,這也是一種在windows中的部署方式,當然如果不使用這種部署方式,調用這個方法,也不會有任何副作用。

再來看看Startup,

技術分享

裏面有兩個方法ConfigurationService和Configure,系統會先執行ConfigurationService再執行Configure,其中ConfigurationService是可選方法,也就是說即使沒有這個方法,也不會報錯,

那麽這兩個方法是幹什麽用的呢,這裏簡單說一下,ConfigurationService是用來配置服務的,這個方法提供了一個IServiceCollection,這是一個依賴註入的容器,所有在這裏註冊的類,之後都可以根據配置自動創建出實例來,IServiceCollection也提供了一些擴展方法來幫助完成一些默認服務的註冊,比如這裏的AddMvc方法,就是用來註冊MVC和WebApi需要用到的服務的,註意,有些服務是中間件必備的,比如這個AddMvc,如果這裏不調用,那麽在Configure中即使註冊了中間件(UseMvc),也將不起作用。

Configure方法提供了IApplicationBuilder參數,通過這個參數我們可以用來註冊中間件,比如這裏的UseMvc,所謂中間件,就是以前版本中Owin的中間件,是一樣的,用來在http管道中攔截和處理請求,由於現在asp.net core已經不再跟IIS綁定了,所有的都是中間件的概念,反而不再特意標識出owin了。

你會發現在Configure中還有幾個參數,其實,除了ConfigurationService這個方法的參數是固定的以外,Configure方法和Startup構造函數的參數都可以隨便定義多少個,前提是只要IServiceCollection容器中已經註冊過了就行(Startup構造函數中的參數需要在WebHost的ConfigureServices中註冊),這也是依賴註入容器的強大之處,更重要的是,中間件的構造函數與Invoke方法、Mvc或WebApi的構造函數、Mvc的View的構造函數,都是一樣采用這種方式的。

接著再看一下Controller,asp.net core應用程序創建完成後,默認帶了一個ValuesController,

技術分享

那個構造函數中的IHostingEnvironment就是我加的,依賴註入容器會自動實例化,這裏要註意和之前的版本不一樣,沒有RoutePrefix這樣的特性了,Route代替了它,而在方法中的屬性路由模板,則直接在HttpGet、HttpPost等Http動作特性裏面直接定義,之前也說了,Mvc和WebApi已經統一,因此,兩者都是繼承於Controller基類,系統自動會根據方法的返回類型執行不同的處理,請忘了Mvc和WebApi的區別吧。

最後,要說一下部署,.net core的部署分為兩種,一種叫便攜式部署,這種部署方式和以前一樣,需要提前在服務器上安裝framework,使用VS發布出來的都是這種,這種方式的執行,需要依靠dotnet命令來執行,需要定位到執行目錄下,執行命令 dotnet 程序集。

還有一種是直接將framework一起打包在程序中,這種發布出來的直接是可執行程序(在windows中就直接是exe文件),這種不需要服務器安裝framework,要想生成這種可執行文件,

需要執行dotnet build -r 目標系統或者dotnet publish -c release -r 目標系統,第一個是用來生成Debug版本的文件,第二個是用來生成release版本的文件,想要能夠正常執行這兩個命令,需要修改項目的csproj文件,

技術分享

在這個地方寫上需要生成的環境名稱,用;隔開,有很多系統可以寫,可以去網上查一下,這裏不說了,當csproj文件被修改後,vs會自動通過nuget獲取各個不同系統需要的包,這個過程可能會比較慢,當完成後,執行之前的命令,則會在指定目錄下生成以目標系統名稱為名字的文件夾,這個文件夾裏面就是目標系統的可執行文件。

之前說過,對於asp.net core來說,IIS可以作為反向代理與它集成,要做到這個,除了需要在程序中調用UseIIIntegration,IIS本身也需要安裝名稱為DotNetCore_WindowsHosting的程序,安裝完成後,可以在IIS的模塊中看到名稱為AspNetCoreModule的模塊,該模塊將攔截請求並轉發給asp.net core程序處理

技術分享

接下來是就和正常的配置沒什麽區別了,新建一個web站點,定位到build的文件夾中,唯一需要註意的是,因為IIS僅僅起到一個反向代理的作用(其實,也可以作為處理靜態內容的服務,這個和java中分離靜態文件和servlet的方式異曲同工),所以在應用程序池中需要選擇無托管代碼

技術分享

系統啟動後,會發現在服務器進程中多了一個dotnet.exe的進程,要以附加進程的方式調試的話,必須附加這個進程,而不是w3wp.exe

asp.net core的基本部署