原文地址:WebListener server for ASP.NET Core
WebListener是一個只能運行在Windows上的ASP.NET Core web服務器,基於Http.Sys內核模塊驅動構建。在不借助IIS作為反向代理服務器的情況下,WebListener可以替代Kestrel用來與直接與互聯網相連。實際上,WebListener不能和IIS或IIS Express一起使用,這是因為它與ASP.NET Core模塊並不兼容。
盡管WebListener為ASP.NET Core而開發,它也可以經由Microsoft.Net.Http.Server NuGet 包而被任何.NET Core和.NET Framework應用所使用。
WebListener支持以下功能:
- Windows Authentication
- Port sharing
- HTTPS with SNI
- HTTP/2 over TLS (Windows 10)
- Direct file transmission
- Response caching
- WebSockets (Windows 8)
支持的Windows版本:
- Windows 7和Windows Server 2008 R2和更高版本
何時使用WebListener
當你需要將服務器直接暴露到互聯網上並且不使用IIS部署時,WebListener會是一個有效的選擇。

因為WebListener基於Http.Sys構建,它不會請求反向代理服務器防御攻擊。對於防御多類攻擊下和保證全功能服務器的健壯性,安全性以及可擴展性而言,Http.Sys是一種成熟的技術。IIS本身作為HTTP偵聽器運行在Http.Sys之上。
在你需要某項只能由Weblistener提供而Kestrel不能支持的功能的時候,對於內部部署應用而言,它也是一個不錯的選擇。

如何使用WebListener
以下是對主機系統和你的ASP.NET Core應用設定任務的簡要概述。
配置 Windows 服務器
-
安裝你的應用所需要的.NET 版本,如.NET Core或是.NET Framework 4.5.1。
-
預注冊URL前綴注冊到WebListener,並建立SSL證書。
如果你在Windows上沒有預先注冊URL前綴,你運行的應用必須具有管理員權限。唯一的例外是,如果你使用HTTP(不是HTTPS)前綴和大於1024的端口號綁定到本地主機,此種情況下不需要管理員權限。
詳細信息,請參考后文中的如何預注冊前綴和配置SSL一節。
-
打開防火牆端口以允許流量到達WebListener。
你可以使用netsh.exe或是PowerShell cmdlets。
關於Http.Sys registry settings的更多信息請點擊相關鏈接。
配置你的ASP.NET Core應用
-
安裝Microsoft.AspNetCore.Server.WebListener Nuget包 ,該包帶有Microsoft.Net.Http.Server包依賴。
-
在應用的
Main方法中調用WebHostBuilder的擴展方法UseWebListener,並指定你需要的WebListener選項和參數,如以下示例所示:
public static int Main(string[] args)
{
Console.WriteLine("Running demo with WebListener.");
var config = new ConfigurationBuilder()
.AddCommandLine(args)
.Build();
var builder = new WebHostBuilder()
.UseContentRoot(Directory.GetCurrentDirectory())
.UseConfiguration(config)
.UseStartup<Startup>()
.UseWebListener(options =>
{
options.ListenerSettings.Authentication.Schemes = AuthenticationSchemes.None;
options.ListenerSettings.Authentication.AllowAnonymous = true;
});
var host = builder.Build();
host.Run();
return 0;
}
-
配置URL和端口進行偵聽
默認的ASP.NET Core項目綁定
http://localhost:5000。通過使用UseUrls擴展方法——編輯urls命令行參數,或者是通過ASP.NET Core配置系統,你可以為 WebListener 配置URL前綴和端口號。更多的信息,請參考Hosting。WebListener使用Http.Sys前綴字符串格式,但是沒有特定於它的前綴字符串格式要求。
Note
請確保你在
UseUrls方法中指定的前綴字符串和你在服務器上預先注冊的字符串是相同的。
-
請確保你的應用未配置為運行IIS或IIS Express。
在Visual Studio中,項目的默認啟動配置服務器是IIS Express。為了能夠在console應用中運行項目,你必須手動更改所選配置文件,如以下屏幕截圖所示:

如何在ASP.NET Core之外運行WebListener
-
安裝Microsoft.Net.Http.ServerNuGet包
-
如你在ASP.NET Core中做的那樣,預注冊URL前綴注冊到WebListener,並建立SSL證書。
關於Http.Sys registry settings的更多信息請點擊相關鏈接。
以下是一個在ASP.NET Core之外演示使用WebListener的代碼示例:
var settings = new WebListenerSettings();
settings.UrlPrefixes.Add("http://localhost:8080");
using (WebListener listener = new WebListener(settings))
{
listener.Start();
while (true)
{
var context = await listener.AcceptAsync();
byte[] bytes = Encoding.ASCII.GetBytes("Hello World: " + DateTime.Now);
context.Response.ContentLength = bytes.Length;
context.Response.ContentType = "text/plain";
await context.Response.Body.WriteAsync(bytes, 0, bytes.Length);
context.Dispose();
}
}
預注冊URL前綴並配置SSL
IIS和WebListener都依賴於底層的Http.Sys內核模塊驅動,用以監聽請求,並做初步處理。在IIS中,圖形化管理界面可以提供給你一個相對容易的方式去進行配置。但是如果你用的是WebListener,那么你需要自己使用內置工具netsh.exe去配置Http.Sys。
你需要使用netsh.exe工具完成的最常見任務是保留URL前綴和分配SSL證書。
對於初學者來說,NetSh.exe並不是一個簡便的工具。以下示例展示了為80/443端口保留URL前綴所需的最少代碼。
netsh http add urlacl url=http://+:80/ user=Users
netsh http add urlacl url=https://+:443/ user=Users
以下示例展示了如何分配SSL證書:
netsh http add sslcert ipport=0.0.0.0:443 certhash=MyCertHash_Here appid={00000000-0000-0000-0000-000000000000}".
以下是官方參考文檔:
以下資源鏈接為多種情況提供了詳細說明。引用文章HttpListener同樣適用基於HTTP.SYS構建的WebListener。
- How to: Configure a Port with an SSL Certificate
- HTTPS Communication - HttpListener based Hosting and Client Certification
這是一篇過時但仍有些有用信息的第三方博客 - How To: Walkthrough Using HttpListener or Http Server unmanaged code (C++) as an SSL Simple Server
這也是一篇過時但仍有些有用信息的博客 - How Do I Set Up A .NET Core WebListener With SSL?
以下列出了一些比netsh.exe命令行工具更容易使用的第三方工具,雖然它們並沒有被微軟提供或認可。正如netsh.exe本身要求具備管理員權限,這些工具也默認如此。
-
HttpSysManager 提供了一個圖形化界面用以偵聽配置SSL證書和選項,前綴預定以及證書信任列表。
-
HttpConfig 可以列出或配置SSL證書和URL前綴。它的圖形化界面比HttpSysManager更精細,並公開了更多的配置選項,除此以外,它也提供了和HttpSysManager相似的功能。HttpConfig不能創建新的證書信任列表(CTL),但是可以分配現有證書。
為了生成自簽名的SSL證書,微軟提供了以下命令行工具:MakeCert.exe和PowerShell cmdlet New-SelfSignedCertificate。它們同樣有第三方的圖形化界面以幫助生成自簽名的SSL證書。
下一步
更多的信息,請參考以下資源:
