ASP.NET Core WebListener 服务器
原文地址: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证书。
下一步
更多的信息,请参考以下资源: