運行ASP.NET Core Web應用(包括 Razor 和 WebAPI),要先配置合適的 HTTP 服務器(或稱 Web 服務器,
這兩者表達的含義是一樣的,HTTP是從協議的角度來說的,Web是從表現形式來說的,
我們現在用到的Web技術,比如ASP.NET、JSP、PHP、Python等都是建立在HTTP協議的基礎上的),
HTTP 服務器的作用是監聽網絡端口,然后處理客戶端發送過來的請求,並將請求的資源(或數據)返回給客戶端。
在這個過程中,我們來具體看一看.NET Core 是如何工作的。
1. ASP.NET Core 時代的 HTTP 服務器 。
與傳統的 Web服務器 IIS 不同,ASP.NET CORE 是將服務器內置到項目中的,
它提供了2種內置的HTTP服務器,分別是:
- Kestrel 服務器(可以跨平台,微軟推薦,這也是默認選項)
- HTTP.sys 服務器(只能用於 Windows,要使用的話需要顯式配置)
他們的工作流程是一樣的,如下圖:
Kestrel:
HTTP.sys
其區別如下(來自官方文檔):
2. ASP.NET CORE項目如何選擇用【HTTP.sys 服務器】。
默認情況下,ASP.NET Core 項目模板使用 Kestrel。 在 Program.cs 中,
ConfigureWebHostDefaults() 方法內部調用了 UseKestrel:
public static IHostBuilder CreateHostBuilder(string[] args) => Host.CreateDefaultBuilder(args) .ConfigureWebHostDefaults(webBuilder => {webBuilder.UseStartup<Startup>();});
如果要更改此默認值,使用 HTTP.sys,可以將代碼修改如下(見紅色部分):
public static IHostBuilder CreateHostBuilder(string[] args) => Host.CreateDefaultBuilder(args) .ConfigureWebHostDefaults(webBuilder => { webBuilder.UseHttpSys(options => { options.AllowSynchronousIO = false; options.Authentication.Schemes = AuthenticationSchemes.None; options.Authentication.AllowAnonymous = true; options.MaxConnections = null; options.MaxRequestBodySize = 30000000; options.UrlPrefixes.Add("http://localhost:5005"); }); webBuilder.UseStartup<Startup>(); });
使用 HTTP.sys要特別注意:
- HTTP.sys 與 ASP.NET Core 模塊不兼容,無法與 IIS 或 IIS Express 結合使用。
- IIS 本身作為 HTTP.sys 之上的 HTTP 偵聽器運行。
3. 為什么ASP.NET CORE要將Web服務器內置到項目中。
- 部署方便(隨身攜帶,不用在目標系統上單獨安裝);
- 便於管理(.NET CORE為我們提供了很多方法來操作它);
- 跨平台(一次編寫,到處運行);
4. 如何用 Kestrel (不使用IIS)來部署Web服務。
以我們之前的權限管理項目為例:
其路徑是:
第1步:打開命令提示符,如下:
第2步:依次輸入"d:" 回車,"cd dotnet5demo\RazorDemo\AuthManagement\AuthManagement" 回車,
將命令提示符的路徑指到 Web項目所在的路徑,也就是包含 "AuthManagement.csproj" 文件的目錄,如下圖:
命令提示符中的路徑必須是項目的路徑,如下:
先將"bin"和"obj"目錄下的文件全部刪除。
在開始第3步之前我們先用瀏覽器訪問一下項目,得到如下結果:
第3步:在命令提示符下輸入"dotnet run" 回車,如下:
可以看到 Web項目已經編譯完成並監聽 "http://localhost:5000" 這個網址和端口,開始提供Web服務了。
(此時可以看到Web項目的 bin 目錄下生成了一個 debug 文件夾,這就是編譯生成的Debug版本 )
此時再打開瀏覽器並刷新,畫面如下:
項目內置的 Kestrel 服務器已經可以提供服務了。
5. Kestrel 服務器 與 IIS結合使用。
Kestrel 還能與其他WEB服務器(如 IIS、Nginx、Apache等)結合使用,此時的WEB服務器作為 Kestrel 的反向代理服務器,
接收來自 Internet 的 HTTP 請求,並將這些請求轉發到 Kestrel ,其工作流程如下:
微軟官方推薦使用反向代理,給出的原因如下:
6. 什么是反向代理服務器。
我們常說的代理是指正向代理,用於代理內部網絡對Internet的連接請求,客戶機必須指定代理服務器,
並將本來要直接發送到Web服務器上的http請求發送到代理服務器中。正向代理的過程,它隱藏了真實的請求客戶端,
服務端不知道真實的客戶端是誰,客戶端請求的服務都被代理服務器代替來請求,如下圖:
反向代理(Reverse Proxy)方式是指以代理服務器來接受Internet上的連接請求,然后將請求轉發給內部網絡上的服務器;
並將從服務器上得到的結果返回給 Internet 上請求連接的客戶端,此時代理服務器對外就表現為一個服務器,如下圖:
簡而言之:
兩者的區別在於代理的對象不一樣:【正向代理】代理的對象是客戶端,【反向代理】代理的對象是服務端。
7. 為什么我們用 dotnet run命令啟動 Kestrel 服務器的端口是 5000 而不是其他。
是因為項目的 launchSettings.json 文件中設置的 applicationUrl 是 http://localhost:5000 的緣故,如下:
"AuthManagement": { "commandName": "Project", "dotnetRunMessages": "true", "launchBrowser": true, "applicationUrl": "http://localhost:5000", "environmentVariables": { "ASPNETCORE_ENVIRONMENT": "Development" }
這里的端口號如果修改成其他值,那么執行 dotnet run 命令后瀏覽器也要用對應的端口號來訪問。
8. 如何關閉 Kestrel 服務器。
如果要關閉 Kestrel 服務器,在命令提示符下按 Ctrl+C 就可以了,如下圖: