原文地址----Kestrel server for ASP.NET Corehtml
By Tom Dykstra, Chris Ross, and Stephen Haltergit
Kestrel是一個基於libuv的跨平臺ASP.NET Core web服務器,libuv是一個跨平臺的異步I/O庫。ASP.NET Core模板項目使用Kestrel做爲默認的web服務器。github
Kestrel支持如下功能:web
Kestrel 被.NET Core支持的全部平臺和版本所支持api
若是你的應用只接收來自內部網絡的請求,你能夠只使用Kestrel自己。服務器
若是你將你的應用部署在公共網絡上,咱們建議你使用IIS,Nginx或者Apache做爲反向代理服務器。一個反向代理服務器接收來自網絡的HTTP請求而且在通過一些初步處理後將請求傳遞到Kestrel服務器。websocket
出於安全性的理由,反向代理經常被edge deployments所採用。由於Kestrel相對較新,對抵禦安全攻擊至今尚未一個完整的功能補充。安全性處理包括但不限於適當的超時,大小的限制,以及併發鏈接限制等問題。網絡
另外一個須要反向代理的場景是,你有多個須要在單獨的服務器上運行並分享同一端口的應用。由於Kestrel不支持在多進程間分享同一端口,因此應用並不能直接和Kestrel合做。當你在某個端口上配置Kestrel運行偵聽時,不算主機頭如何標識,Kestrel會爲該端口處理全部的流量。反向代理能夠爲多個應用共享惟一端口並將流量發送給Kestrel。併發
即便不須要反向代理服務器,使用它也能夠簡化負載均衡和SSL設置 -- 只要你的反向代理服務器須要SSL證書,而且該服務器能夠和你的應用在內部網中經過普通HTTP進行通訊。
安裝 Microsoft.AspNetCore.Server.Kestrel Nuget包。
在應用的Main
方法中調用WebHostBuilder
的UseKestrel
擴展方法,指定你須要的Kestrel選項,如如下示例所示:
public static int Main(string[] args) { Console.WriteLine("Running demo with Kestrel."); var config = new ConfigurationBuilder() .AddCommandLine(args) .Build(); var builder = new WebHostBuilder() .UseContentRoot(Directory.GetCurrentDirectory()) .UseConfiguration(config) .UseStartup<Startup>() .UseKestrel(options => { if (config["threadCount"] != null) { options.ThreadCount = int.Parse(config["threadCount"]); } }) .UseUrls("http://localhost:5000"); var host = builder.Build(); host.Run(); return 0; }
默認狀況下,ASP.NET Core項目綁定了http://localhost:5000
。經過使用UseUrls
擴展方法——編輯urls
命令行參數,或者是經過ASP.NET Core配置系統,你能夠爲Ketrel配置URL前綴和端口號以用來偵聽請求。關於這些方法更多的信息,請參考Hosting。有關於當你使用IIS做爲反向代理時,URL綁定是如何工做的信息,請參考ASP.NET Core 模塊。
Kestrel URL前綴能夠是如下格式中的任一種。
http://65.55.39.10:80/ https://65.55.39.10:443/
http://[0:0:0:0:0:ffff:4137:270a]:80/ https://[0:0:0:0:0:ffff:4137:270a]:443/
IPv6中的 [::] 等價於 IPv4 0.0.0.0。
http://contoso.com:80/ http://*:80/ https://contoso.com:443/ https://*:443/
主機名稱,*,以及+,都不是特殊的。任何沒有公認的IP 或是「localhost」的地址將綁定到全部的IPv4和IPv6的IP上。若是你須要爲不一樣的ASP.NET Core應用在同一端口上綁定不一樣的主機名,請使用WebListener或者諸如IIS,Nginx或Apache這樣的反向代理服務器。
* "Localhost" 名稱和端口號或回送IP地址和端口號
http://localhost:5000/ http://127.0.0.1:5000/ http://[::1]:5000/
當localhost
被指定時,Kestrel會嘗試去綁定到IPv4和IPv6的環回接口。若是被請求的端口號正在任一環回接口上被其餘服務所使用,Kestrel將會啓動失敗。若是任一環回接口出於各類緣由而不可用(最一般的狀況是由於IPv6暫不被支持),Kestrel將記錄下一個警告信息。
http://unix:/run/dan-live.sock
若是你指定了端口號0,Kestrel將動態地綁定到合適的端口號。除了localhost
名稱,綁定到0端口號被其餘任何主機名稱或IP地址所容許。
當你指定了端口號0,你可使用IServerAddressesFeature
接口去決定運行時Kestrel實際綁定到哪一個端口。下列示例用於獲取綁定端口而且在console上顯示出來。
public void Configure(IApplicationBuilder app, ILoggerFactory loggerFactory) { loggerFactory.AddConsole(); 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>"); }); }
若是你調用UseSSL
擴展方法,請確保在https:
中包含URL前綴,以下所示:
var host = new WebHostBuilder() .UseKestrel(options => { options.UseHttps("testCert.pfx", "testPassword"); }) .UseUrls("http://localhost:5000", "https://localhost:5001") .UseContentRoot(Directory.GetCurrentDirectory()) .UseStartup<Startup>() .Build();
Note
HTTPS和HTTP不能在同一端口上被託管。
更多的信息,請參考如下資源:
本教程在本地僅使用Kestrel,在將該應用部署到Azure以後,它將在Windows上使用IIS做爲反向代理服務器。