ASP.NET Core 2.2 基础知识(十) Web服务器 - Kestrel
ASP.NET Core 应用与进程内的 HTTP 服务器实现一起运行.该服务器实现侦听 HTTP 请求,并在一系列请求功能被写到 HttpContext 时,将这些请求展现到应用中.
ASP.NET Core 随附两种服务器实现:
- Kestrel 是适用于 ASP.NET Core 的默认跨平台 HTTP 服务器.
- HTTP.sys 是仅适用于 Windows 的 HTTP 服务器,它基于 HTTP.sys 核心驱动程序和 HTTP 服务器 API.在 ASP.NET 1.x 中被命名为 WebListener.
Kestrel
Kestrel 可以单独使用,也可以与反向代理服务器(如IIS,Nginx 或 Apache)一起使用.反向代理服务器接收到来自 Internet 的 HTTP 请求,并在运行一些初步处理后,将这些请求转发到 Kestrel.
将 IIS 或 IIS Express 用作 ASP.NET Core 的反向代理时,ASP.NET Core 应用在独立于 IIS 工作进程的某个进程中运行.在 IIS 进程中,ASP.NET Core 模块协调反向代理关系.ASP.NET Core 模块的主要功能是启动ASP.NET Core 应用,在其出现故障时重启应用,并向应用转发 HTTP 流量.
HTTP.sys
如果 ASP.NET Core 应用在 Windows 上运行,则 HTTP.sys 是 Kestrel 的替代选项.为了获得最佳性能,通常建议使用 Kestrel,在向 Internet 公开应用且所需功能受 HTTP.sys 支持(而不是 Kestrel)的方案中,可以使用HTTP.sys.
何时结合使用 Kestrel 和反向代理
即使不需要反向代理服务器,使用反向代理服务器也是个不错的选择:
- 它可以限制所承载的应用中的公开的公共外围应用;
- 它可以提供额外的配置和防护层;
- 它可以更好地与现有基础结构集成;
- 他可以简化负载均衡和SSL配置,仅反向代理服务器需要SSL证书,并且该服务器可以使用普通 HTTP 在内部网络上与应用服务器通信.
启用 Kestrel
默认情况下,ASP.NET Core 项目的 Program.cs 文件中 的 CreateDefaultBuilder 方法内部调用了 UseKestrel .
Kestrel 选项
Kestrel Web 服务器有很多选项,这些选项在面相 Internet 的部署中非常重要:
public static IWebHostBuilder CreateWebHostBuilder(string[] args)
{
return WebHost.CreateDefaultBuilder(args)
.UseStartup<Startup>()
.UseKestrel((context, options) =>
{
//设置最大连接数,默认不受限制
{
options.Limits.MaxConcurrentConnections = ; //对于已从 HTTP 或 HTTPS 升级到另一个协议(例如,Websocket 请求)的连接,使用下面这个属性设置最大连接数.
options.Limits.MaxConcurrentUpgradedConnections = ;
} //请求正文限制,默认最大 30,000,000 字节,约 28.6 MB.
{
options.Limits.MaxRequestBodySize = * ;
} /*请求正文最小数据速率和宽限期
Kestrel 每秒检查一次数据是否以指定的速率(字节/秒)传入.如果速率低于最小值,则连接超时。
宽限期是 Kestrel 提供给客户端用于将其发送速率提升到最小值的时间量.在此期间不会检查速率.宽限期有助于避免最初由于 TCP 慢启动而以较慢速率发送数据的连接中断。
默认的最小速率为 240 字节/秒,包含 5 秒的宽限期。
最小速率也适用于响应。
*
*/
{
options.Limits.MinRequestBodyDataRate = new MinDataRate(, TimeSpan.FromSeconds());
options.Limits.MinResponseDataRate = new MinDataRate(, TimeSpan.FromSeconds());
}
});
}
终结点配置
默认情况下,ASP.NET Core 应用绑定到 http//localhost:5000 ,如果创建项目时勾选了 "为 HTTPS 配置" ,则还会绑定到 https://localhosst:5001
这点,我们从 launchSetting.json 文件中也可以查到:
"Demo1": {
"commandName": "Project",
"launchBrowser": true,
"launchUrl": "api/values",
"applicationUrl": "https://localhost:5001;http://localhost:5000",
"environmentVariables": {
"ASPNETCORE_ENVIRONMENT": "Development"
}
}
我们可以通过修改 launchSetting.json 文件来修改终结点.
"Demo2": {
"commandName": "Project",
"launchBrowser": true,
"launchUrl": "api/values",
"applicationUrl": "http://localhost:5566;http://localhost:6677;https://localhost:7788",
"environmentVariables": {
"ASPNETCORE_ENVIRONMENT": "Development"
}
也可以通过 UseUrls 方法修改终结点:
public static IWebHostBuilder CreateWebHostBuilder(string[] args) =>
WebHost.CreateDefaultBuilder(args)
.UseStartup<Startup>()
.UseUrls("http://localhost:9527","https://localhost:8848");
修改端口号
public static IWebHostBuilder CreateWebHostBuilder(string[] args)
{
return WebHost.CreateDefaultBuilder(args)
.UseStartup<Startup>() //下面三种修改方式都是可以的.
.ConfigureKestrel(options => { options.ListenLocalhost(9902); });
//.UseKestrel(options => { options.ListenLocalhost(9901); });
//.UseKestrel((context, options) => { options.ListenLocalhost(9900); })
}
如果我们设置端口号 为 0 ,那么 Kestrel 将动态绑定到可用的端口号.
public static IWebHostBuilder CreateWebHostBuilder(string[] args)
{
return WebHost.CreateDefaultBuilder(args)
.UseStartup<Startup>()
//正确方法
.UseKestrel(options => { options.ListenAnyIP(); });
//.UseUrls("http://127.0.0.1:0");
//.UseKestrel((context, options) => { options.ListenAnyIP(0); });
//.ConfigureKestrel(options => { options.ListenAnyIP(0); }); //错误写法: ListenLocalhost(0) 及 UseUrls("http://localhost:0");
}
ASP.NET Core 2.2 基础知识(十) Web服务器 - Kestrel的更多相关文章
- ASP.NET Core 2.2 基础知识(十八) 托管和部署 概述
为了方便演示,以 .NET Core 控制台应用程序讲解. 我们新建一个控制台应用程序,安装 "Newtonsoft.Json" Nuget 包,然后右键点击该项目,选择" ...
- ASP.NET Core 2.2 基础知识(十二) 发送 HTTP 请求
可以注册 IHttpClientFactory 并将其用于配置和创建应用中的 HttpClient 实例. 这能带来以下好处: 提供一个中心位置,用于命名和配置逻辑 HttpClient 实例. 例如 ...
- ASP.NET Core 2.2 基础知识(十六) SignalR 概述
我一直觉得学习的最好方法就是先让程序能够正常运行,才去学习他的原理,剖析他的细节. 就好像这个图: 所以,我们先跟着官方文档,创建一个 SignalR 应用: https://docs.microso ...
- ASP.NET Core 2.2 基础知识(十四) WebAPI Action返回类型(未完待续)
要啥自行车,直接看手表 //返回基元类型 public string Get() { return "hello world"; } //返回复杂类型 public Person ...
- ASP.NET Core 2.2 基础知识(十五) Swagger
安装 Nuget 包 注册 Swagger public void ConfigureServices(IServiceCollection services) { services.AddMvc() ...
- ASP.NET Core 2.2 基础知识(十一) ASP.NET Core 模块
ASP.NET Core 应用与进程内的 HTTP 服务器实现一起运行.该服务器实现侦听 HTTP 请求,并在一系列请求功能被写到 HttpContext 时,将这些请求展现到应用中. ASP.NET ...
- ASP.NET Core 2.2 基础知识(十三) WebAPI 概述
我们先创建一个 WebAPI 项目,看看官方给的模板到底有哪些东西 官方给出的模板: [Route("api/[controller]")] [ApiController] pub ...
- ASP.NET Core 2.2 基础知识(九) 使用托管服务实现后台任务
在 ASP.NET Core 中,后台任务作为托管服务实现.托管服务是一个类,而且必须实现 IHostedService 接口,该接口定义了两个方法: StartAsync(CancellationT ...
- ASP.NET Core 2.2 基础知识(八) 主机 (未完待续)
主机负责应用程序启动和生存期管理.共有两个主机 API : 1.Web 主机 : 适用于托管 Web 应用,基于 IWebHostBuilder ; 2.通用主机 : 适用于托管非 Web 应用. 基 ...
随机推荐
- POJ2155 Matrix 【二维线段树】
题目链接 POJ2155 题解 二维线段树水题,蒟蒻本想拿来养生一下 数据结构真的是有毒啊,, TM这题卡常 动态开点线段树会TLE[也不知道为什么] 直接开个二维数组反倒能过 #include< ...
- 洛谷 P3084 [USACO13OPEN]照片Photo 解题报告
[USACO13OPEN]照片Photo 题目描述 农夫约翰决定给站在一条线上的\(N(1 \le N \le 200,000)\)头奶牛制作一张全家福照片,\(N\)头奶牛编号\(1\)到\(N\) ...
- 树剖模板by fcdalao
#include<bits/stdc++.h> using namespace std; ; *MX]; *MX]; int n,Index,fir[MX],fa[MX],dfn[MX], ...
- 【NOIP模拟赛】 permutation 数学(打表)
biubiu~~~ 这道题卡读题卡得很死......首先他告诉我们读循环的时候要顺着圈读,然后又说这个圈在数列上要以最大数开始读,而且以这样的循环的首数排序,得到的序列与原序列一样那么他就是可行序列, ...
- Swing学习篇 API [一]Swing常用组件
1.按钮(Jbutton) Swing中的按钮是Jbutton,它是javax.swing.AbstracButton类的子类,swing中的按钮可以显示图像,并且可以将按钮设置为窗口的默认图标,而且 ...
- yaf的安装
http://kenby.iteye.com/blog/1979899 yaf源码分析学习网站 # wget https://github.com/laruence/php-yaf/archive/m ...
- 关于session variables 和 global variables
背景 有同学问到这样一个问题:原来的binlog格式是statement,为什么执行了 set global binlog_format='row' 和 set binlog_format='row' ...
- ES6学习笔记(五)—— 编程风格
1. 块级作用域 let 取代 var —— let 只在声明的代码块内有效,而且不存在变量提升的效用 const 取代 let —— const 比较符合函数式编程的思想,运算不改变值,只是新建值: ...
- Sequence(ST表)(洛谷P2048)
超级钢琴 知识储备 在做这道题前,我们先要了解一下ST表(一种离线求区间最值的方法) ST表使用DP实现的,其查询复杂度为O(1). 那么我们怎么用DP实现呢?? 首先,我们设立一个状态f[i][j] ...
- [Leetcode Week8]Subsets
Subsets 题解 原创文章,拒绝转载 题目来源:https://leetcode.com/problems/subsets/description/ Description Given a set ...