ASP.NET Core 的 IIS 托管实现全解析:进程内/进程外双模式、源码结构与构建测试指南 ASP.NET Core 的 IIS 托管实现全解析进程内/进程外双模式、源码结构与构建测试指南【免费下载链接】aspnetcoreASP.NET Core is a cross-platform .NET framework for building modern cloud-based web applications on Windows, Mac, or Linux.项目地址: https://gitcode.com/GitHub_Trending/as/aspnetcoreASP.NET Core IIS Web Server 是 ASP.NET Core 在 Windows 上依托 IISInternet Information Services提供的一种灵活、安全的托管方案其完整实现位于本仓库的 src/Servers/IIS 目录。本文以该目录的 README.md 为主线深入讲解进程内in-process与进程外out-of-process两种托管模式的工作原理、目录结构与各模块职责、ASP.NET Core Module 的配置项以及从源码构建和运行测试的完整流程帮助读者既能在实战中正确配置 IIS 部署也能快速读懂这套由原生 C 与托管 C# 代码组成的服务器实现。一、IIS 托管概述两种模式一条主线从架构层面看ASP.NET Core 应用托管在 IIS 上时存在两种截然不同的运行模式二者共享同一个 ASP.NET Core ModuleANCM 作为 IIS 与 .NET 运行时之间的桥接层进程内托管In-Process应用的所有托管代码直接运行在 IIS 的 worker 进程w3wp.exe内部请求由 ANCM 直接传递给进程内的托管服务器处理省去了进程间通信开销请求吞吐表现更优也是当前推荐的默认模式。进程外托管Out-of-ProcessIIS确切地说是 ANCM充当反向代理将请求转发给一个独立运行的 .NET 进程该进程内部由 Kestrel 服务器监听本地回环地址并处理请求再将响应返回给 IIS。选择哪种模式由web.config中aspNetCore节点的hostingModel属性决定。仓库内 NativeIISSample 的 web.config 给出了一个真实的进程内配置示例aspNetCore processPath%LAUNCHER_PATH% arguments%LAUNCHER_ARGS% forwardWindowsAuthTokenfalse stdoutLogEnabledfalse hostingModelinprocess/从源码结构看两种模式在仓库中各有独立的托管代码工程进程内模式的托管实现位于 IIS/进程外模式的托管实现位于 IISIntegration/而负责两种模式请求转发的原生代码则统一位于 AspNetCoreModuleV2/。二、仓库布局src/Servers/IIS 目录结构详解README.md 明确指出该文件夹包含 IIS Web Server 实现的全部相关代码。整个目录由原生组件、托管组件和测试基础设施三大部分构成。1. AspNetCoreModuleV2/全部原生代码这一目录承载了 ASP.NET Core Module 的全部原生 C 代码是 IIS 与 .NET 应用交互的底层实现其下各子目录职责如下子目录职责AspNetCore/ASP.NET Core Module 的 shim垫片层是 IIS 与进程内/进程外模块交互的最薄一层包含模块入口、应用管理与请求分发逻辑如dllmain.cpp、applicationmanager.cpp、proxymodule.cppCommonLib/所有原生组件共享的公共代码包括配置读取ConfigurationSection.cpp、事件日志EventLog.cpp、HostFxr 解析HostFxrResolver.cpp、app_offline 轮询PollingAppOfflineApplication.cpp等CommonLibTests/ASP.NET Core Module 的原生测试IISLib/与 IIS 交互的公共代码InProcessRequestHandler/进程内托管的原生实现OutOfProcessRequestHandler/进程外托管的原生实现RequestHandlerLib/进程内与进程外托管共享的请求处理代码2. IIS/ 与 IISIntegration/两组托管代码IIS/进程内托管的托管C#代码。核心是 IISHttpServer.cs 中实现的IISHttpServer : IServer它通过GCHandle持有自身引用并向原生层注册请求、关闭、断连、异步完成等回调实现原生请求上下文与托管HttpContext的对接。IISIntegration/进程外托管的托管C#代码负责建立 IIS 与 Kestrel 之间的桥接详见下文第四节。3. IntegrationTesting.IIS/IIS 测试基础设施IntegrationTesting.IIS/ 包含启动 IIS 与 IISExpress 的测试基础设施用于在集成测试中自动化拉起真实服务器环境。此外 tools/ 目录还提供了运维辅助脚本例如 InstallIISFeatures.ps1 用于安装/启用 IIS 相关 Windows 功能UpdateIISExpressCertificate.ps1 用于更新 IIS Express 的 HTTPS 开发证书。三、进程内托管In-Process托管代码如何接入 w3wp.exe进程内模式的托管实现通过 WebHostBuilderIISExtensions.UseIIS() 完成接入。该方法首先通过NativeMethods.IsAspNetCoreModuleLoaded()判断当前是否运行在 ANCM 环境中若确认是进程内模式则通过NativeMethods.HttpGetApplicationProperties()从原生层获取应用属性物理路径、绑定地址、是否启用 Windows/Basic 认证、最大请求体大小等以应用物理路径设置内容根目录UseContentRoot并去掉结尾的目录分隔符以与其他服务器保持一致注册IISNativeApplication包装原生句柄NativeSafeHandle、IServer实现IISHttpServer、认证处理器与IISServerSetupFilter启动过滤器将IISServerOptions从原生配置数据中填充包括绑定地址列表按;分割、是否转发 Windows 认证、MaxRequestBodySize等以自定义的IISHostLifetime替换默认的ConsoleLifetime——代码注释明确指出默认的 ConsoleLifetime 在Preload Enabled true时可能导致关机挂起因此进程内模式必须使用专属的宿主生命周期实现。请求到达时原生层通过 IISHttpServer.cs 中的HandleRequest回调进入托管代码从GCHandle还原服务器实例创建IISHttpContext并投递到线程池处理随后返回RQ_NOTIFICATION_PENDING让 IIS 保持请求挂起状态响应完成后通过OnAsyncCompletion回调通知原生层继续处理。整个链路实现了 IIS 原生请求管道与 ASP.NET Core 中间件管道的无缝对接无需额外的进程间通信。IISServerOptions进程内模式的关键配置进程内模式的可配置项集中定义在 IISServerOptions.cs 中常见选项及默认值如下选项默认值说明AllowSynchronousIOfalse是否允许对HttpContext.Request/HttpContext.Response执行同步 IOAutomaticAuthenticationtrue为true时服务器自动设置HttpContext.User为false时仅在显式请求对应认证方案时才提供身份。注意 Windows 认证也必须在 IIS 中启用AuthenticationDisplayNamenull登录页上向用户展示的显示名称MaxRequestBodySize30,000,000字节约 28.6 MB请求体最大字节数设为null表示 ASP.NET Core 层不限制但 IIS 的maxAllowedContentLength默认 30,000,000 字节仍会限制对升级Upgrade连接始终不限制可被IHttpMaxRequestBodySizeFeature按请求覆盖。设置负数会抛出ArgumentOutOfRangeExceptionMaxRequestBodyBufferSize1 MB服务器为尚未消费的请求体缓冲的最大字节数值得注意的细节是IISHttpServer在构造函数中会比较MaxRequestBodySize与原生层传入的IisMaxRequestSizeLimit若托管层设置的限额超过原生限额会记录MaxRequestLimitWarning日志提示两个层的限制需要协同配置详见 IISHttpServer.cs。四、进程外托管Out-of-ProcessIIS 反向代理到 Kestrel进程外模式由 IISIntegration/ 中的托管代码支撑核心机制如下。1. HostingStartup 自动接入IISHostingStartup.cs 通过程序集级的[assembly: HostingStartup(typeof(IISHostingStartup))]声明使应用在启动时自动调用UseIISIntegration()用户无需手动修改Program.cs即可获得 IIS 集成能力。2. UseIISIntegration 的环境变量协议WebHostBuilderIISExtensions.cs进程外 展示了 ANCM 与托管层之间的通信协议——全部通过ASPNETCORE_前缀的环境变量传递环境变量含义ASPNETCORE_PORTANCM 为 Kestrel 分配的本地监听端口ASPNETCORE_APPL_PATH应用的虚拟路径ASPNETCORE_TOKEN配对令牌Pairing Token用于校验请求确实来自 ANCMASPNETCORE_IIS_HTTPAUTHIIS 上启用的认证类型列表以;分隔为空时出于对旧版 ANCM 的兼容按启用认证处理ASPNETCORE_IIS_WEBSOCKETS_SUPPORTED是否支持 WebSocket未设置时回退为按 Windows 版本 6.2推断UseIISIntegration()会将这些参数组合成http://127.0.0.1:{port}的服务器地址UseSetting(WebHostDefaults.ServerUrlsKey, address)且PreferHostingUrls(true)并注册IISSetupFilter携带配对令牌与虚拟路径、ForwardedHeadersOptions转发X-Forwarded-For与X-Forwarded-Proto以及IISOptions。3. IISMiddleware请求验证与信息转发IISMiddleware.cs 是进程外模式请求管道的守门人其Invoke方法按顺序执行配对令牌校验将请求头MS-ASPNETCORE-TOKEN与期望的令牌比对不一致直接返回400 Bad Request防止未授权请求进入应用关机指令处理识别发往/iisintegration路径、携带MS-ASPNETCORE-EVENT: shutdown头的 POST 请求触发IHostApplicationLifetime.StopApplication()实现 ANCM 驱动的优雅关闭调试器辅助当调试器已附加且收到DEBUG方法请求时直接短路返回——这是 Visual Studio 调试器用于触发 IIS/ANCM 启动进程以便附加的专用请求客户端证书转发当ForwardClientCertificate开启时从MS-ASPNETCORE-CLIENTCERT头还原ITlsConnectionFeatureWindows 认证令牌转发当ForwardWindowsAuthentication开启时从MS-ASPNETCORE-WINAUTHTOKEN头解析出 Windows 身份句柄构造WindowsPrincipal并设置到HttpContext.UserAutomaticAuthentication开启时同时通过Response.OnCompleted在响应结束后清理身份避免句柄泄漏WebSocket 能力控制若 ANCM 不支持 WebSocket则移除IHttpUpgradeFeature。五、ASP.NET Core Module 配置架构web.config 里的每一个属性ANCM 的配置架构定义在 aspnetcore_schema_v2.xml 中该文件同时是 IIS 配置系统的 Schema 扩展。system.webServer/aspNetCore节支持的属性及其默认值/取值范围如下均来自该 Schema 文件属性类型默认值取值范围说明processPathstring支持扩展——托管应用的可执行文件路径如dotnet或应用 exeargumentsstring支持扩展—传递给processPath的命令行参数startupTimeLimituint1200,3600应用启动超时时间秒shutdownTimeLimituint100,600应用关闭超时时间秒rapidFailsPerMinuteuint100,100每分钟内允许的快速失败次数超过后 ANCM 停止启动进程requestTimeouttimeSpan00:02:000,1296000秒级校验进程外模式的请求超时时间stdoutLogEnabledboolfalse—是否将 stdout 重定向到日志文件stdoutLogFilestring支持扩展.\aspnetcore-stdout—stdout 日志文件路径模板processesPerApplicationuint11,100每个应用启动的进程数进程外模式forwardWindowsAuthTokenbooltrue—是否将 Windows 认证令牌转发给应用disableStartUpErrorPageboolfalse—是否禁用启动错误页hostingModelstring——托管模式inprocess或outofprocess不同版本默认值不同Schema 中还定义了三类可嵌套的元素recycleOnFileChange通过file path.../子元素指定一组文件任一文件变化即触发应用回收environmentVariables通过environmentVariable name... value.../为托管进程注入自定义环境变量handlerSettings通过handlerSetting name... value.../传递额外的处理器级设置。由于该 Schema 注释明确说明不要手工编辑此文件如需扩展配置节应在本目录放置类似的.xml文件它们会在启动时被自动加载。六、开发环境搭建从源码构建与测试 IIS 组件1. 前提条件README 明确强调两点限制IIS 只能在 Windows 上使用——所有相关组件、测试与工具均针对 Windows/IIS 环境设计构建需要 VS C 原生组件。安装方法请参照 docs/BuildFromSource.md 中 Windows 相关章节。2. 构建在src/Servers/IIS目录下执行仓库的 build.cmd 即可完成该项目的源码构建 ./build.cmd更详细的仓库级构建步骤参见 docs/BuildFromSource.md。3. 测试运行本项目测试同样在src/Servers/IIS目录下执行 ./build.cmd -t命令行运行测试的通用说明参见 docs/BuildFromSource.md。需要特别注意的是IIS.Tests 要求同时满足两个前置条件IIS 功能已启用可使用仓库中的 InstallIISFeatures.ps1 脚本辅助开启已安装 ASP.NET Hosting Bundle且安装必须发生在 IIS 启用之后。此外也可以在项目tests目录与src目录平级下通过dotnet test运行指定项目的测试。七、更多资源项目整体说明见仓库根目录 README.mdIIS 服务器源码入口src/Servers/IISASP.NET Core Module 原生实现AspNetCoreModuleV2/进程内托管配置选项IISServerOptions.cs进程外桥接中间件IISMiddleware.csANCM 配置 Schemaaspnetcore_schema_v2.xml。总体来看src/Servers/IIS是一个典型的“原生管道 托管服务器”双层架构上层由 C# 实现服务器行为与配置模型下层由 C 实现与 IIS 的深度集成。理解进程内/进程外两种模式的分工再对照web.config的配置属性逐项调优即可在生产环境中获得稳定高效的 IIS 托管效果。【免费下载链接】aspnetcoreASP.NET Core is a cross-platform .NET framework for building modern cloud-based web applications on Windows, Mac, or Linux.项目地址: https://gitcode.com/GitHub_Trending/as/aspnetcore创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考