使用 IIS 和 ASP.NET Core 进行进程内托管
进程内托管在与其 IIS 工作进程相同的进程中运行 ASP.NET Core 应用。 进程内承载相较进程外承载提供更优的性能,因为请求并不通过环回适配器进行代理,环回适配器是一个网络接口,用于将传出的网络流量返回给同一计算机。
下图说明了 IIS、ASP.NET Core 模块和进程内托管的应用之间的关系:
启用进程内托管
自 ASP.NET Core 3.0 起,默认情况下已为部署到 IIS 的所有应用启用进程内托管。
若要显式配置进程内托管的应用,请在项目文件 (.csproj
) 中将 <AspNetCoreHostingModel>
属性的值设置为 InProcess
:
<PropertyGroup>
<AspNetCoreHostingModel>InProcess</AspNetCoreHostingModel>
</PropertyGroup>
一般体系结构
请求的常规流程如下:
- 请求从 Web 到达内核模式 HTTP.sys 驱动程序。
- 驱动程序将本机请求路由到网站的配置端口上的 IIS,通常为 80 (HTTP) 或 443 (HTTPS)。
- ASP.NET Core 模块接收本机请求,并将其传递给 IIS HTTP 服务器 (
IISHttpServer
)。 IIS HTTP 服务器是将请求从本机转换为托管的 IIS 进程内服务器实现。
在 IIS HTTP 服务器处理请求后:
- 请求被发送到 ASP.NET Core 中间件管道。
- 中间件管道处理该请求并将其作为
HttpContext
实例传递给应用的逻辑。 - 应用的响应通过 IIS HTTP 服务器传递回 IIS。
- IIS 将响应发送到发起请求的客户端。
CreateDefaultBuilder
添加 IServer 实例的方式是:调用 UseIIS 方法来启动 CoreCLR 和将应用托管在 IIS 工作进程(w3wp.exe
或 iisexpress.exe
)内。 性能测试表明,与在进程外托管应用并将请求代理传入 Kestrel 相比,在进程中托管 .NET Core 应用可提供明显更高的请求吞吐量。
作为单个文件可执行文件发布的应用无法由进程内托管模型加载。
应用程序配置
要配置 IIS 选项,请在 ConfigureServices 中包括 IISServerOptions 的服务配置。 下面的示例禁用 AutomaticAuthentication:
services.Configure<IISServerOptions>(options =>
{
options.AutomaticAuthentication = false;
});
选项 | 默认 | 设置 |
---|---|---|
AutomaticAuthentication |
true |
若为 true ,IIS 服务器将设置经过 Windows 身份验证进行身份验证的 HttpContext.User 。 若为 false ,服务器仅提供 HttpContext.User 的标识并在 AuthenticationScheme 显式请求时响应质询。 必须在 IIS 中启用 Windows 身份验证使 AutomaticAuthentication 得以运行。 有关详细信息,请参阅 Windows 身份验证。 |
AuthenticationDisplayName |
null |
设置在登录页上向用户显示的显示名。 |
AllowSynchronousIO |
false |
HttpContext.Request 和 HttpContext.Response 是否允许同步 I/O。 |
MaxRequestBodySize |
30000000 |
获取或设置 HttpRequest 的最大请求正文大小。 请注意,IIS 本身有限制 maxAllowedContentLength ,这一限制将在 IISServerOptions 中设置 MaxRequestBodySize 之前进行处理。 更改 MaxRequestBodySize 不会影响 maxAllowedContentLength 。 若要增加 maxAllowedContentLength ,请在 web.config 中添加一个将 maxAllowedContentLength 设置为更高值的项。 有关更多详细信息,请参阅配置。 |
进程内和进程外托管之间的差异
在进程内托管时,将应用以下特征:
-
使用 IIS HTTP 服务器 (
IISHttpServer
),而不是 Kestrel 服务器。 对于进程内托管,CreateDefaultBuilder 会调用 UseIIS 来进行以下操作:- 注册
IISHttpServer
。 - 在 ASP.NET Core 模块后运行时,配置服务器应侦听的端口和基本路径。
- 配置主机以捕获启动错误。
- 注册
-
requestTimeout
属性不适用于进程内托管。 -
不支持在应用之间共享应用池。 每个应用使用一个应用池。
-
应用和已安装的运行时(x64 或 x86)的体系结构(位数)必须与应用池的体系结构匹配。 例如,为 32 位 (x86) 发布的应用必须已为其 IIS 应用程序池启用 32 位。 有关详细信息,请参阅创建 IIS 站点部分。
-
检测到客户端连接断开。 客户端断开连接时,将取消 HttpContext.RequestAborted 取消标记。
-
在进程内托管时,不会在内部调用 AuthenticateAsync 来初始化用户。 因此,默认情况下不激活每次身份验证后用于转换声明的 IClaimsTransformation 实现。 使用 IClaimsTransformation 实现转换声明时,请调用 AddAuthentication 以添加身份验证服务:
C#public void ConfigureServices(IServiceCollection services) { services.AddTransient<IClaimsTransformation, ClaimsTransformer>(); services.AddAuthentication(IISServerDefaults.AuthenticationScheme); } public void Configure(IApplicationBuilder app) { app.UseAuthentication(); }
-
不支持 Web 包(单文件)部署。
建议的内容
-
使用 IIS 和 ASP.NET Core 进行进程外托管
了解如何使用 IIS 和 ASP.NET Core 模块进行进程外托管。
-
ASP.NET Core 模块
了解用于通过 IIS 托管 ASP.NET Core 应用的 ASP.NET Core 模块。
-
IIS 模块与 ASP.NET Core
了解适用于 ASP.NET Core 应用的活动和非活动 IIS 模块以及如何管理 IIS 模块。
-
ASP.NET Core 模块的日志创建和重定向
配置 IIS 和 ASP.NET Core 模块以捕获日志和诊断信息。
原文地址:https://www.cnblogs.com/march25000/p/15246312.html
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- lru算法和redis的lru
- ThreadLocal
- 前端开发:font属性与font-variant如何使用?
- spring-boot使用aop进行多数据源切换
- CRC校验原来这么简单
- centos7安装kubernetes教程
- spring-boot自定义starter
- 实操 | kafka如何手动异步提交offset
- 解惑 | 为什么我根据时间戳获得的offset为空呢?
- spring-boot使用aop进行日志记录
- openGauss备机追数Catchup过程中主库写入阻塞问题
- openGauss830版本中对于备份模块的增强与当前问题
- spring boot自动配置原理
- 网站日志分析完整实践
- 聊聊分布式下的WebSocket解决方案