ASPNET Core 2.x中的Kestrel服务器
Kestrel是一個基于libuv的跨平臺ASP.NET Core web服務器,libuv是一個跨平臺的異步I/O庫。ASP.NET Core模板項目使用Kestrel作為默認的web服務器。
Kestrel支持以下功能:
HTTPS
用于啟用不透明升級的WebSockets
位于Nginx之后的高性能Unix sockets
Kestrel 被.NET Core支持的所有平臺和版本所支持
查看和下載示例代碼
?何時一起使用Kestrel和反向代理服務器?
ASP.NET CORE 2.x
? ? ?你可以單獨或者與反向代理服務器(如?IIS, Nginx, or Apache)一起使用Kestrel。反向代理從互聯網接受HTTP請求,預處理后轉發給Kestrel.
如果Kestrel僅暴露與內網中,有或沒有反向代理的配置。
? ?一個需要反向代理的場景是,你有多個需要在一個服務器上運行并共享同一端口的應用。因為Kestrel不支持在多進程間共享同一端口和同一個IP,在此情況下無法工作。當你配置Kestrel監聽某個端口時,它會接管所有的流量,而不管主機標頭是什么。反向代理可以共享出多個端口,然后轉發給Ketrel的唯一IP和端口。
? ? 即時反向代理不是必須的,但在某些場景下,使用反向代理是一個更好的選擇:
它可以限定你面對的網絡區域.
它可以提供多一個附加層,以提供附加的的防護.
它可以更好地與現有架構集成。
使用它也可以簡化負載均衡和SSL設置 -- 只要你的反向代理服務器需要SSL證書,并且該服務器可以和你的應用在內部網中通過普通HTTP進行通信。
? ???如何在ASP.NET CORE APP中使用KESTREL
?ASP.NET CORE 2.x
? ??Microsoft.AspNetCore.Server.Kestrel?包已經包含在?Microsoft.AspNetCore.All metapackage中.
ASP.NET Core 工程模板缺省使用 Kestrel 。在?Program.cs中, 模板代碼為?CreateDefaultBuilder, 它用這句語句調用?UseKestrel?:
public static void Main(string[] args) {BuildWebHost(args).Run(); }public static IWebHost BuildWebHost(string[] args) => ? ?WebHost.CreateDefaultBuilder(args) .UseStartup<Startup>().UseKestrel(options =>{options.Listen(IPAddress.Loopback, 5000);options.Listen(IPAddress.Loopback, 5001, listenOptions =>{listenOptions.UseHttps("testCert.pfx", "testPassword");});}).Build();?如果你要配置Kestrel選項, 請在?Program.cs?如下例所示調用?UseKestrel?:
public static void Main(string[] args) {BuildWebHost(args).Run(); }public static IWebHost BuildWebHost(string[] args) =>WebHost.CreateDefaultBuilder(args).UseStartup<Startup>() ? ? ? ?.UseKestrel(options => ? ? ? ?{ ? ? ? ? ? ?options.Listen(IPAddress.Loopback, 5000); ? ? ? ? ? ?options.Listen(IPAddress.Loopback, 5001, listenOptions => ? ? ? ? ? ?{ ? ? ? ? ? ? ? ?listenOptions.UseHttps("testCert.pfx", "testPassword"); ? ? ? ? ? ?}); ? ? ? ?}).Build();?Kestrel 選項
?
? ?Kestrel web server有一些約束選項,做面對互聯網的不是時會非常用用。下面是你能設置的一些限制條件:
最大連接客戶數
最大請求體大小Maximum request body size
最小請求提數據率Minimum request body data rate
你需要在?KestrelServerOptions?類的Limits屬性中設置這些約束?。??Limits?屬性控制?KestrelServerLimits?類的實例.
最大連接客戶數
參考一下代碼:
.UseKestrel(options =>{ ? ?options.Limits.MaxConcurrentConnections = 100; ? ?options.Limits.MaxConcurrentUpgradedConnections = 100;options.Limits.MaxRequestBodySize = 10 * 1024;options.Limits.MinRequestBodyDataRate = new MinDataRate(bytesPerSecond: 100, gracePeriod: TimeSpan.FromSeconds(10));options.Limits.MinResponseDataRate = new MinDataRate(bytesPerSecond: 100, gracePeriod: TimeSpan.FromSeconds(10));options.Listen(IPAddress.Loopback, 5000);options.Listen(IPAddress.Loopback, 5001, listenOptions =>{listenOptions.UseHttps("testCert.pfx", "testPassword");}); })Maximum request body size
? ? 缺省值為30,000,000byte, 大約是28.6MB。
? ?在ASP .NET CORE MVC 的APP中,建議在action方法中使用?RequestSizeLimit?屬性來重寫它:
[RequestSizeLimit(100000000)]public IActionResult MyActionMethod()? 下面是一個配置整個應用內每一個請求的Maximum request body size的例子:
.UseKestrel(options =>{options.Limits.MaxConcurrentConnections = 100;options.Limits.MaxConcurrentUpgradedConnections = 100; ? options.Limits.MaxRequestBodySize = 10 * 1024;options.Limits.MinRequestBodyDataRate = new MinDataRate(bytesPerSecond: 100, gracePeriod: TimeSpan.FromSeconds(10));options.Limits.MinResponseDataRate = new MinDataRate(bytesPerSecond: 100, gracePeriod: TimeSpan.FromSeconds(10));options.Listen(IPAddress.Loopback, 5000);options.Listen(IPAddress.Loopback, 5001, listenOptions =>{listenOptions.UseHttps("testCert.pfx", "testPassword");}); })? ?你也可以在一個中間件中設置特定請求的值:
app.Run(async (context) =>{ ? ?context.Features.Get<IHttpMaxRequestBodySizeFeature>() ? ? ? ?.MaxRequestBodySize = 10 * 1024 ? ?context.Features.Get<IHttpMinRequestBodyDataRateFeature>() ? ? ? ?.MinDataRate = new MinDataRate(bytesPerSecond: 100, gracePeriod: TimeSpan.FromSeconds(10)); ? ?context.Features.Get<IHttpMinResponseDataRateFeature>() ? ? ? ?.MinDataRate = new MinDataRate(bytesPerSecond: 100, gracePeriod: TimeSpan.FromSeconds(10));?Kestrel的其他選項,參考下面的類:
KestrelServerOptions
KestrelServerLimits
ListenOptions
?終端配置
? ? 缺省情況下,ASP.NET CORE綁定 http://localhost:5000. 通過在KestrelServerOptions上調用Listen 或者ListenUnixSocket方法可以配置Kestrel監聽的URL和端口。(UseUrls, urls命令行參數,ASPNETCORE_URLS環境變量也能工作,定有一些限制,參考這里。
?綁定到一個TCP socket
? 一下,Listen?方法綁定一個TCP socket, ?lumbda 選項配置一個SSL驗證:
public static void Main(string[] args) {BuildWebHost(args).Run(); }public static IWebHost BuildWebHost(string[] args) =>WebHost.CreateDefaultBuilder(args).UseStartup<Startup>() ? ? ? ?.UseKestrel(options => ? ? ? ?{ ? ? ? ? ? ?options.Listen(IPAddress.Loopback, 5000); ? ? ? ? ? ?options.Listen(IPAddress.Loopback, 5001, listenOptions => ? ? ? ? ? ?{ ? ? ? ? ? ? ? ?listenOptions.UseHttps("testCert.pfx", "testPassword"); ? ? ? ? ? ?}); ? ? ? ?}).Build();? ? 請注意這個例子是如何用ListenOptions為部分終端配置SSL的。你可以用同一個API為部分終端配置其他Kestrel設置。
? ?在windows系統中,你可以使用PowerShell的命令?New-SelfSignedCertificate生成自簽名SLL證書,當然也有其他更好用的第三方工具生成你的自簽名證書,如:
SelfCert
Makecert UI
? ?在macOS 和 Linux你可以使用?OpenSSL創建自己的自簽名證書。更多信息請參考?Setting up HTTPS for development.
綁定到Unix socket
You can listen on a Unix socket for improved performance with Nginx, as shown in this example:
.UseKestrel(options =>{options.ListenUnixSocket("/tmp/kestrel-test.sock");options.ListenUnixSocket("/tmp/kestrel-test.sock", listenOptions =>{listenOptions.UseHttps("testCert.pfx", "testpassword");}); })Port 0
如果你指定端口號為0, Kestrel 會動態綁定一個可用的端口.下面的例子顯示如何找到Kestrel運行時實際綁定了哪個端口:
public void Configure(IApplicationBuilder app, ILoggerFactory loggerFactory) { ? ?var serverAddressesFeature = app.ServerFeatures.Get<IServerAddressesFeature>();app.UseStaticFiles();app.Run(async (context) =>{context.Response.ContentType = "text/html"; ? ? ? ?await context.Response.WriteAsync("<p>Hosted by Kestrel</p>"); ? ? ? ?if (serverAddressesFeature != null){ ? ? ? ? ? ?await context.Response ? ? ? ? ? ? ? ?.WriteAsync("<p>Listening on the following addresses: " + ? ? ? ? ? ? ? ? ? ?string.Join(", ", serverAddressesFeature.Addresses) + ? ? ? ? ? ? ? ? ? ?"</p>");} ? ? ? ?await context.Response.WriteAsync($"<p>Request URL: {context.Request.GetDisplayUrl()}<p>");}); }UserUrsl的限制?
IIS的終端配置?
URL prefixes
原文地址:http://www.cnblogs.com/ccjungle/p/7514198.html
.NET社區新聞,深度好文,微信中搜索dotNET跨平臺或掃描二維碼關注
總結
以上是生活随笔為你收集整理的ASPNET Core 2.x中的Kestrel服务器的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 体验 ASP.NET Core 中的多语
- 下一篇: Azure School与开源