ASP.NET Core 系列之一 : ASP.NET CORE中的Web服務器的介紹


運行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 就可以了,如下圖:

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM