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的更多相关文章

  1. ASP.NET Core 2.2 基础知识(十八) 托管和部署 概述

    为了方便演示,以 .NET Core 控制台应用程序讲解. 我们新建一个控制台应用程序,安装 "Newtonsoft.Json" Nuget 包,然后右键点击该项目,选择" ...

  2. ASP.NET Core 2.2 基础知识(十二) 发送 HTTP 请求

    可以注册 IHttpClientFactory 并将其用于配置和创建应用中的 HttpClient 实例. 这能带来以下好处: 提供一个中心位置,用于命名和配置逻辑 HttpClient 实例. 例如 ...

  3. ASP.NET Core 2.2 基础知识(十六) SignalR 概述

    我一直觉得学习的最好方法就是先让程序能够正常运行,才去学习他的原理,剖析他的细节. 就好像这个图: 所以,我们先跟着官方文档,创建一个 SignalR 应用: https://docs.microso ...

  4. ASP.NET Core 2.2 基础知识(十四) WebAPI Action返回类型(未完待续)

    要啥自行车,直接看手表 //返回基元类型 public string Get() { return "hello world"; } //返回复杂类型 public Person ...

  5. ASP.NET Core 2.2 基础知识(十五) Swagger

    安装 Nuget 包 注册 Swagger public void ConfigureServices(IServiceCollection services) { services.AddMvc() ...

  6. ASP.NET Core 2.2 基础知识(十一) ASP.NET Core 模块

    ASP.NET Core 应用与进程内的 HTTP 服务器实现一起运行.该服务器实现侦听 HTTP 请求,并在一系列请求功能被写到 HttpContext 时,将这些请求展现到应用中. ASP.NET ...

  7. ASP.NET Core 2.2 基础知识(十三) WebAPI 概述

    我们先创建一个 WebAPI 项目,看看官方给的模板到底有哪些东西 官方给出的模板: [Route("api/[controller]")] [ApiController] pub ...

  8. ASP.NET Core 2.2 基础知识(九) 使用托管服务实现后台任务

    在 ASP.NET Core 中,后台任务作为托管服务实现.托管服务是一个类,而且必须实现 IHostedService 接口,该接口定义了两个方法: StartAsync(CancellationT ...

  9. ASP.NET Core 2.2 基础知识(八) 主机 (未完待续)

    主机负责应用程序启动和生存期管理.共有两个主机 API : 1.Web 主机 : 适用于托管 Web 应用,基于 IWebHostBuilder ; 2.通用主机 : 适用于托管非 Web 应用. 基 ...

随机推荐

  1. [洛谷P3195][HNOI2008]玩具装箱TOY

    题目大意:有n个物体,大小为$c_i$.把第i个到第j个放到一起,容器的长度为$x=j-i+\sum\limits_{k-i}^{j} c_k$,若长度为x,费用为$(x-L)^2$.费用最小. 题解 ...

  2. AtCoder Grand Contest 028 B - Removing Blocks 解题报告

    B - Removing Blocks Time limit : 2sec / Memory limit : 1024MB Score : 600 points ## Problem Statemen ...

  3. JS表单验证优化

    var validate = (function(){ var messages = { isEmail : '输入正确格式邮箱', isPhoneNum : '输入正确手机号' }; var val ...

  4. Java并发(4)- synchronized与CAS

    引言 上一篇文章中我们说过,volatile通过lock指令保证了可见性.有序性以及"部分"原子性.但在大部分并发问题中,都需要保证操作的原子性,volatile并不具有该功能,这 ...

  5. js如何弹出新窗口

    js如何弹出新窗口 时间:2012-4-22 弹出新窗口也是在网页设计中会经常用到的,其用法也很简单,是通过调用javascript的内置函数windows.open来产生的.  window.ope ...

  6. HDU 1877 又一版 A+B(进制转换)

    看了http://lovnet.iteye.com/blog/1690276的答案 好巧妙的方法 递归实现十进制向m进制转换 #include "stdio.h" int m; v ...

  7. codevs1063 合并果子 优先队列(小根堆)

    题目传送门 这道题很容易想到优先把两堆重量最小的合并比较优 然后乱搞一下就可以啦 #include<cstdio> #include<cstring> #include< ...

  8. NPOI的使用Excel模板导出 可插入到指定行

    Excel模版建议把需要添加数据行的样式设置好 模版样式,导出后效果 [2017-11-22 对获取需插入数据的首行样式有时为空报错修改] /// <summary> /// 根据模版导出 ...

  9. Linux内核官方文档atomic_ops.txt【摘自Linux 内核文档】

    摘自Linux内核文档 Documentation/atomic_ops.txt,不是本人原创 Semantics and Behavior of Atomic and Bitmask Operati ...

  10. gpio子系统和pinctrl子系统(上)

    前言 随着内核的发展,linux驱动框架在不断的变化.很早很早以前,出现了gpio子系统,后来又出现了pinctrl子系统.在网上很难看到一篇讲解这类子系统的文章.就拿gpio操作来说吧,很多时候都是 ...