加入收藏 | 设为首页 | 会员中心 | 我要投稿 云计算网_汕头站长网 (https://www.0754zz.com/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长学院 > Asp教程 > 正文

ASP.NET Core的Kestrel服务器

发布时间:2022-10-15 12:46:33 所属栏目:Asp教程 来源:
导读:  Kestrel是一个基于libuv的跨平台ASP.NET Core web服务器,libuv是一个跨平台的异步I/O库。ASP.NET Core模板项目使用Kestrel作为默认的web服务器。

  Kestrel支持以下功能:

  Kestrel 被.NET Core支
  Kestrel是一个基于libuv的跨平台ASP.NET Core web服务器,libuv是一个跨平台的异步I/O库。ASP.NET Core模板项目使用Kestrel作为默认的web服务器。
 
  Kestrel支持以下功能:
 
  Kestrel 被.NET Core支持的所有平台和版本所支持
 
  查看或下载示例代码
 
  何时使用Kestrel和反向代理服务器
 
  如果你的应用只接收来自内部网络的请求,你可以只使用Kestrel本身。
 
  如果你将你的应用部署在公共网络上,我们建议你使用IIS,Nginx或者Apache作为反向代理服务器。一个反向代理服务器接收来自网络的HTTP请求并且在经过一些初步处理后将请求传递到Kestrel服务器。
 
  出于安全性的理由,反向代理常常被edge deployments所采用。因为Kestrel相对较新,对抵御安全攻击至今还没有一个完整的功能补充。安全性处理包括但不限于适当的超时,大小的限制,以及并发连接限制等问题。
 
  另一个需要反向代理的场景是,你有多个需要在单独的服务器上运行并分享同一端口的应用。因为Kestrel不支持在多进程间分享同一端口,所以应用并不能直接和Kestrel合作。当你在某个端口上配置Kestrel运行侦听时,不算主机头如何标识,Kestrel会为该端口处理所有的流量。反向代理可以为多个应用共享唯一端口并将流量发送给Kestrel。
 
  即使不需要反向代理服务器,使用它也可以简化负载均衡和SSL设置 -- 只要你的反向代理服务器需要SSL证书,并且该服务器可以和你的应用在内部网中通过普通HTTP进行通信。
 
  如何在ASP.NET Core应用中使用Kestrel
 
  安装Microsoft.AspNetCore.Server.KestrelNuget包。
 
  在应用的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()
   ? ? ? ?.UseKestrel(options =>
   ? ? ? ?{ ? ? ? ? ? ?if (config["threadCount"] != null)
   ? ? ? ? ? ?{
   ? ? ? ? ? ? ? ?options.ThreadCount = int.Parse(config["threadCount"]);
   ? ? ? ? ? ?}
   ? ? ? ?})
   ? ? ? ?.UseUrls("http://localhost:5000"); ? ?var host = builder.Build();
   ? ?host.Run(); ? ?return 0;
  }
  URL 前缀
 
  默认情况下,ASP.NET Core项目绑定了:5000。通过使用UseUrls扩展方法——编辑urls命令行参数,或者是通过ASP.NET Core配置系统,你可以为Ketrel配置URL前缀和端口号以用来侦听请求。关于这些方法更多的信息,请参考Hosting。有关于当你使用IIS作为反向代理时asp服务器,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();
   ? ?app.UseStaticFiles();
   ? ?app.Run(async (context) =>
   ? ?{
   ? ? ? ?context.Response.ContentType = "text/html"; ? ? ? ?await context.Response
   ? ? ? ? ? ?.WriteAsync("
  Hosted by Kestrel
 
  "); ? ? ? ?if (serverAddressesFeature != null)
   ? ? ? ?{ ? ? ? ? ? ?await context.Response
   ? ? ? ? ? ? ? ?.WriteAsync("
  Listening on the following addresses: " + ? ? ? ? ? ? ? ? ? ?string.Join(", ", serverAddressesFeature.Addresses) + ? ? ? ? ? ? ? ? ? ?"
 
  ");
   ? ? ? ?} ? ? ? ?await context.Response.WriteAsync($"
  Request URL: {context.Request.GetDisplayUrl()}
 
  ");
   ? ?});
  }
 
  SSL的URL前缀
 
  如果你调用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()
   ? .Build();
 

(编辑:云计算网_汕头站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!