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跨平台或扫描二维码关注

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/323574.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

全文搜索!收藏这篇Solr ElasticSearch 长文就可以搞定

转载自 全文搜索&#xff01;收藏这篇Solr ElasticSearch 长文就可以搞定 摘自&#xff1a;JaJian博кē Java后端技术编者说&#xff1a;文章从浅到深&#xff0c;描述了什么是全文搜索&#xff0c;为什么要使用全文搜索&#xff0c;Solr和ElasticSearch的发展和比较。文章比…

网页弹框弹出

完成这个功能需要在 弹框弹出 点击之后 才会显示内容 <!DOCTYPE html> <html><head><title>对话框测试</title><script>alert("对话框测试");</script></head><body>对话框测试&#xff1a;</body> …

Azure School与开源

距离Azure School(https://school.azure.cn/) 的正式上线时间&#xff0c;2017.8.3&#xff0c;已经过去了20多天了。这20多天得到了很多有帮助的建议和反馈&#xff0c;小伙伴们都很给力&#xff0c;互相帮助扶持&#xff0c;调整产品不正确的地方&#xff0c;快速迭代新的功能…

select count(*)底层究竟干了啥么?

转载自 select count(*)底层究竟干了啥么&#xff1f; “SELECT COUNT( * ) FROM t” 是个再常见不过的 SQL 需求了。在 MySQL 的使用规范中&#xff0c;我们一般使用事务引擎 InnoDB 作为(一般业务)表的存储引擎&#xff0c;在此前提下&#xff0c;COUNT( * )操作的时间复杂…

为什么不应该重写service方法

转载自 为什么不应该重写service方法 故事通常是这样开始的&#xff1a; 从前&#xff0c;有一个程序猿&#xff0c;他语重心长地对孙子说&#xff1a;“孩子&#xff0c;要是你以后写servlet&#xff0c;最好不要重写service方法啊” 孙子大为不解&#xff0c;程序猿又说&…

.net core之ACG小站爬虫(二)

紧跟着上一节说的文章&#xff0c;虽然已经放出了所写的全代码&#xff0c;但还是再解释一下另外一个页面的请求和分析过程吧。PS&#xff1a;又可以愉快的水一章了&#xff0c;咕嘿嘿。页面分析上回说到下载按钮的href属性是javascript:;伪协议&#xff0c;导致了新打开的页面…

.net core之ACG小站爬虫(一)

想到好久没写过.net的代码了&#xff0c;因此就尝试来写一写.net的代码。此外&#xff0c;也想要熟悉一下Phantomjs。环境配置.net core下载。可选的可以下载宇宙大IDEVisual Studio&#xff0c;当然更加推荐使用Visual Studio Code进行代码的书写。Phantomjs。这个不用说了&am…

数组:完成等差等比数列,及其他数列

有没有想过用c语言来编写一些数列呢&#xff0c;编写数列&#xff0c;数组是最好的选择。 等差&#xff1a; #include<stdio.h> main(){ int a[1000],b,i;a[0]1;scanf("%d",&b);for(i0;i<b;i){a[i1]a[i]2;}for(i0;i<b;i){printf("a%d%-8d\t&q…

Spring MVC竟然有5种参数绑定的方式?你知道几种?

转载自 Spring MVC竟然有5种参数绑定的方式&#xff1f;你知道几种&#xff1f; SpringMVC参数绑定&#xff0c;简单来说就是将客户端请求的key/value数据绑定到controller方法的形参上&#xff0c;然后就可以在controller中使用该参数了下面通过5个常用的注解演示下如何进行参…

微服务中如何切换配置文件、部署

大家好&#xff0c;我是雄雄&#xff0c;欢迎关注微信公众号&#xff1a;雄雄的小课堂 最近改了个微服务的项目&#xff0c;在本身的业务上加上一个演示的业务。 以前没有弄过微服务的项目&#xff0c;这次改完之后&#xff0c;部署花了不少时间&#xff0c;一方面是因为服务器…

asp.net core mvc View Component 应用

ViewComponent1、View 组件介绍在ASP.NET CORE MVC中,View组件有点类似于partial views,但是他们更强大&#xff0c;View组件不能使用model binding,当你调用它的时候仅仅依赖与你提供的数据一个View组件特点&#xff1a;.呈现一大块而不是一个整体的响应。 .包含在控制器和视…

分离三位数

#include<stdio.h> main(){ int k,l,m,n;printf("请输入一个三位数"); scanf("%d",&k);lk/100;mk/10%10;nk%10;printf("这个三位数的百位是:%d\n",l);printf("这个三位数的十位是:%d\n",m);printf("这个三位数的个位是…

大湾区第二次.NET技术交流会圆满成功

2017年9月16日的深圳阳光明媚&#xff0c;一场为庆祝.NET Core 2.0发布和.NET 社区大会&#xff08;https://www.dotnetconf.net/&#xff09; 的召开的本地社区活动&#xff0c;这次活动还得到如鹏网杨中科老师的大力支持开通网上直播&#xff0c;网上有300多位参与活动&#…

五分钟轻松了解Hbase面向列的存储

转载自 五分钟轻松了解Hbase面向列的存储 说明&#xff1a;从严格的列式存储的定义来看&#xff0c;Hbase并不属于列式存储&#xff0c;有人称它为面向列的存储&#xff0c;请各位看官注意这一点。 行式存储 传统的数据库是关系型的&#xff0c;且是按行来存储的。如下图&a…

jeecg微服务项目调用接口报错Token验证失效的解决方法

大家好&#xff0c;我是雄雄。 前言 今天&#xff0c;记录一篇啼笑皆非的问题。 昨晚上在做微信公众号开发时&#xff0c;遇到了个解决好久的问题&#xff0c;即&#xff1a;微信公众号上配置服务器信息之后&#xff0c;回调服务器接口总是报错token验证失败。 剧透&#xf…

是时候开始用C#快速开发移动应用了

从2015年接触Xamarin到至今已经2个年头&#xff0c;我对Xamarin的技能没有长进多少&#xff0c;但它却已经足够成熟到在跨平台移动开发工具中占有一席之地。在扫了一些资料之后&#xff0c;突然发现国外有很多移动端的应用已经是用Xamarin开发&#xff0c;Telerik还有专门的团队…

十分钟理解负载均衡

转载自 十分钟理解负载均衡 开头先理解一下所谓的“均衡” 不能狭义地理解为分配给所有实际服务器一样多的工作量&#xff0c;因为多台服务器的承载能力各不相同&#xff0c;这可能体现在硬件配置、网络带宽的差异&#xff0c;也可能因为某台服务器身兼多职&#xff0c;我们…

输入一个字母,转大小写

用scanf完成 #include<stdio.h> main(){char m;scanf("%c",&m);if(m>a&&m<z){mm-32;}else if(m>A&&m<Z){m32;}printf("%c",m);}用getcahr完成 #include<stdio.h> main(){char m;mgetchar();if(m>a&&…

.net core 使用Redis的发布订阅

Redis是一个性能非常强劲的内存数据库&#xff0c;它一般是作为缓存来使用&#xff0c;但是他不仅仅可以用来作为缓存&#xff0c;比如著名的分布式框架dubbo就可以用Redis来做服务注册中心。接下来介绍一下.net core 使用Redis的发布/订阅功能。Redis 发布订阅Redis 发布订阅(…

MYSQL性能优化的最佳20+条经验

转载自 MYSQL性能优化的最佳20条经验 今天&#xff0c;数据库的操作越来越成为整个应用的性能瓶颈了&#xff0c;这点对于Web应用尤其明显。关于数据库的性能&#xff0c;这并不只是DBA才需要担心的事&#xff0c;而这更是我们程序员需要去关注的事情。当我们去设计数据库表结…