ASP.NET Core 2.2 基礎知識(十) Web服務器 - Kestrel


 

ASP.NET Core 應用與進程內的 HTTP 服務器實現一起運行.該服務器實現偵聽 HTTP 請求,並在一系列請求功能被寫到 HttpContext 時,將這些請求展現到應用中.

ASP.NET Core 隨附兩種服務器實現:

  • Kestrel 是適用於 ASP.NET Core 的默認跨平台 HTTP 服務器.
  • HTTP.sys 是僅適用於 Windows 的 HTTP 服務器,它基於 HTTP.sys 核心驅動程序和 HTTP 服務器 API.在 ASP.NET 1.x 中被命名為 WebListener.

Kestrel

Kestrel 可以單獨使用,也可以與反向代理服務器(如IIS,Nginx 或 Apache)一起使用.反向代理服務器接收到來自 Internet 的 HTTP 請求,並在運行一些初步處理后,將這些請求轉發到 Kestrel.

將 IIS 或 IIS Express 用作 ASP.NET Core 的反向代理時,ASP.NET Core 應用在獨立於 IIS 工作進程的某個進程中運行.在 IIS 進程中,ASP.NET Core 模塊協調反向代理關系.ASP.NET Core 模塊的主要功能是啟動ASP.NET Core 應用,在其出現故障時重啟應用,並向應用轉發 HTTP 流量. 

HTTP.sys

如果 ASP.NET Core 應用在 Windows 上運行,則 HTTP.sys 是 Kestrel 的替代選項.為了獲得最佳性能,通常建議使用 Kestrel,在向 Internet 公開應用且所需功能受 HTTP.sys 支持(而不是 Kestrel)的方案中,可以使用HTTP.sys.

 

何時結合使用 Kestrel 和反向代理

即使不需要反向代理服務器,使用反向代理服務器也是個不錯的選擇:

  • 它可以限制所承載的應用中的公開的公共外圍應用;
  • 它可以提供額外的配置和防護層;
  • 它可以更好地與現有基礎結構集成;
  • 他可以簡化負載均衡和SSL配置,僅反向代理服務器需要SSL證書,並且該服務器可以使用普通 HTTP 在內部網絡上與應用服務器通信.

 

啟用 Kestrel 

默認情況下,ASP.NET Core 項目的 Program.cs 文件中 的 CreateDefaultBuilder 方法內部調用了 UseKestrel .

 

Kestrel 選項

Kestrel Web 服務器有很多選項,這些選項在面相 Internet 的部署中非常重要:

        public static IWebHostBuilder CreateWebHostBuilder(string[] args)
        {
            return WebHost.CreateDefaultBuilder(args)
                .UseStartup<Startup>()
             .UseKestrel((context, options) =>
                {
                    //設置最大連接數,默認不受限制
                    {
                        options.Limits.MaxConcurrentConnections = 100;

                        //對於已從 HTTP 或 HTTPS 升級到另一個協議(例如,Websocket 請求)的連接,使用下面這個屬性設置最大連接數.
                        options.Limits.MaxConcurrentUpgradedConnections = 100;
                    }

                    //請求正文限制,默認最大 30,000,000 字節,約 28.6 MB.
                    {
                        options.Limits.MaxRequestBodySize = 10 * 1024;
                    }

                    /*請求正文最小數據速率和寬限期
                      Kestrel 每秒檢查一次數據是否以指定的速率(字節/秒)傳入.如果速率低於最小值,則連接超時。
                      寬限期是 Kestrel 提供給客戶端用於將其發送速率提升到最小值的時間量.在此期間不會檢查速率.寬限期有助於避免最初由於 TCP 慢啟動而以較慢速率發送數據的連接中斷。
                      默認的最小速率為 240 字節/秒,包含 5 秒的寬限期。
                      最小速率也適用於響應。
                     *
                     */
                    {
                        options.Limits.MinRequestBodyDataRate = new MinDataRate(100, TimeSpan.FromSeconds(10));
                        options.Limits.MinResponseDataRate = new MinDataRate(100, TimeSpan.FromSeconds(10));
                    }
                });
        }

 

終結點配置

默認情況下,ASP.NET Core 應用綁定到 http//localhost:5000 ,如果創建項目時勾選了 "為 HTTPS 配置" ,則還會綁定到 https://localhosst:5001

 

這點,我們從 launchSetting.json 文件中也可以查到:

    "Demo1": {
      "commandName": "Project",
      "launchBrowser": true,
      "launchUrl": "api/values",
      "applicationUrl": "https://localhost:5001;http://localhost:5000",
      "environmentVariables": {
        "ASPNETCORE_ENVIRONMENT": "Development"
      }
    }

 

我們可以通過修改  launchSetting.json 文件來修改終結點.

    "Demo2": {
      "commandName": "Project",
      "launchBrowser": true,
      "launchUrl": "api/values",
      "applicationUrl": "http://localhost:5566;http://localhost:6677;https://localhost:7788",
      "environmentVariables": {
        "ASPNETCORE_ENVIRONMENT": "Development"
      }

 

可以通過 UseUrls 方法修改終結點:

        public static IWebHostBuilder CreateWebHostBuilder(string[] args) =>
            WebHost.CreateDefaultBuilder(args)
                .UseStartup<Startup>()
                .UseUrls("http://localhost:9527","https://localhost:8848");

 

 修改端口號

        public static IWebHostBuilder CreateWebHostBuilder(string[] args)
        {
            return WebHost.CreateDefaultBuilder(args)
                .UseStartup<Startup>()

                //下面三種修改方式都是可以的.
                .ConfigureKestrel(options => { options.ListenLocalhost(9902); });
                //.UseKestrel(options => { options.ListenLocalhost(9901); });
                //.UseKestrel((context, options) => { options.ListenLocalhost(9900); })
        }

如果我們設置端口號 為 0 ,那么 Kestrel 將動態綁定到可用的端口號.

        public static IWebHostBuilder CreateWebHostBuilder(string[] args)
        {
            return WebHost.CreateDefaultBuilder(args)
                .UseStartup<Startup>()
               //正確方法
                .UseKestrel(options => { options.ListenAnyIP(0); });
                //.UseUrls("http://127.0.0.1:0");
                //.UseKestrel((context, options) => { options.ListenAnyIP(0); });
                //.ConfigureKestrel(options => { options.ListenAnyIP(0); });

               //錯誤寫法: ListenLocalhost(0) 及 UseUrls("http://localhost:0");
        }

 

 

 

 

 


免責聲明!

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



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