IIS 后面挂 Kestrel,这 3 个配置错了就 502

ASP.NET Core新手必看:IIS和Kestrel到底选哪个?从零开始的部署避坑指南 本文深入探讨ASP.NET Core部署中IIS与Kestrel的选型策略,提供实战指南与避坑建议。针对不同场景分析两种服务器的性能、安全及运维差异,涵盖Windows/Linux环境部署流程、混合架构配置及性能优化技巧,帮助开发者做出明智选择。 阅读详情

502 Bad Gateway——部署 ASP.NET Core 应用时最常见的报错。IIS 明明跑着,Kestrel 也明明跑着,但请求就是过不去。这篇文章讲三个最容易配错的地方,每个都能让你 502。

先说清楚架构。

IIS 后面挂 Kestrel,本质是IIS 做反向代理。用户请求到 IIS,IIS 通过 ASP.NET Core Module(ANCM)把请求转发给 Kestrel,Kestrel 执行你的应用代码,响应原路返回。

这条链路上任何一个环节断了,IIS 就返回 502。而三个配置错了,链路必断。

01 ANCM 没装或版本不匹配

这是 502.5 的头号元凶。

ANCM = ASP.NET Core Module。它是 IIS 和 Kestrel 之间的桥梁——没有它,IIS 不知道怎么启动 dotnet 进程,也不知道怎么转发请求。

两种情况会出问题:

① 服务器上没装 ANCM——你部署了应用,IIS 找不到模块,直接 502.5。这在全新服务器上最常见,装了 IIS 但忘了装 .NET Core Hosting Bundle。

② 装了但版本不匹配——你的应用 target 是 .NET 8,服务器上只有 .NET 6 的 runtime。ANCM 启动 dotnet 进程时找不到对应的 runtime,进程立即崩溃,IIS 收到 502.5。

怎么查?看 Windows 事件查看器:

应用程序日志 → 来源: IIS AspNetCore Module
错误: Could not find the assembly 'aspnetcorev2_outofprocess.dll'

看到这条就是模块没装对。

解法:装 .NET Core Hosting Bundle(不是 SDK,是 Hosting Bundle)。它包含 ANCM + .NET Runtime,一条命令搞定。去微软官网下对应版本的 installer,装完 iisreset 一下。

⚠️ 坑中坑:升级 .NET 版本后,老版本的 ANCM 可能残留。检查 IIS 管理器 → 模块 → 看是否有重复的 AspNetCoreModuleV2,清理掉旧版本。

02 web.config 的 hostingModel 配错

这是最容易迷的坑,因为两种托管模式的配置完全不同。

ASP.NET Core 在 IIS 里有两种托管模式:

InProcess——不启动独立 Kestrel 进程,ANCM 直接在 IIS 工作进程(w3wp.exe)内托管应用。性能最好,但你的代码跑在 IIS 进程里。

OutOfProcess——ANCM 启动独立的 dotnet 进程(Kestrel),IIS 做反向代理转发请求。隔离性更好,但多一层转发开销。

配错的典型场景:你以为用的是 OutOfProcess,但 web.config 写了 InProcess,结果 ANCM 试图在进程内托管,但你的 Program.cs 里配了 Kestrel 特有的设置(比如 ListenUnixSocket),启动直接崩。

web.config 长这样:

<?xml version="1.0" encoding="utf-8"?>
<configuration>
  <system.webServer>
    <handlers>
      <add name="aspNetCore" path="*" verb="*"
           modules="AspNetCoreModuleV2"
           resourceType="Unspecified" />
    </handlers>
    <aspNetCore processPath="dotnet"
                arguments=".\MyApp.dll"
                hostingModel="inprocess"
                stdoutLogEnabled="true"
                stdoutLogFile=".\logs\stdout" />
  </system.webServer>
</configuration>

三个关键属性:

processPath——InProcess 模式下写 dotnet 或 .\MyApp.exe;OutOfProcess 模式下一样。但如果你的应用是 self-contained 部署,必须写 .\MyApp.exe,不能写 dotnet——因为服务器上可能没装 runtime。

arguments——framework-dependent 部署写 .\MyApp.dll;self-contained 不需要。

hostingModel——inprocess 或 outofprocess。.NET 6+ 默认 InProcess,但如果你显式写了 OutOfProcess,别又在 Program.cs 里用 IIS 专有 API。

💡 排查手段:开启 stdout 日志——把 stdoutLogEnabled="true",确保 logs\stdout 目录存在且有 IIS 权限。502 时去看这个日志,启动错误信息全在里面。

03 请求转发超时和大小限制不一致

这个坑最阴——不是启动就 502,而是跑着跑着偶发 502。用户上传大文件时 502,或者长耗时接口偶发 502,其他请求正常。

原因是 IIS 和 Kestrel 各有各的限制,两层没对齐。

① 请求超时

IIS 侧:web.config 里 <aspNetCore requestTimeout="00:02:00" /> 默认 2 分钟。超了 IIS 直接断连,返回 502。

Kestrel 侧:KestrelServerOptions.Limits.KeepAliveTimeout 默认 130 秒。如果 IIS 的 requestTimeout 比 Kestrel 的 KeepAliveTimeout 长,会出现 IIS 还在等、Kestrel 已经关连接的情况——502。

对齐原则:IIS 的 requestTimeout 必须小于 Kestrel 的 KeepAliveTimeout。留 10-20 秒余量。

② 请求体大小限制

IIS 侧:<requestLimits maxAllowedContentLength="30000000" />(约 28.6MB),在 system.webServer/security/requestFiltering 里配。

Kestrel 侧:KestrelServerOptions.Limits.MaxRequestBodySize 默认 30MB(~28.6MB)。

看起来差不多?但如果你的接口需要上传 100MB 文件,两层都要改。只改 Kestrel 不改 IIS,IIS 先拦住返回 413;只改 IIS 不改 Kestrel,Kestrel 拒绝,IIS 收到错误返回 502。

配置示例:

<!-- IIS 侧:web.config -->
<security>
  <requestFiltering>
    <requestLimits maxAllowedContentLength="104857600" />
  </requestFiltering>
</security>

<aspNetCore requestTimeout="00:05:00" ... />
// Kestrel 侧:Program.cs
builder.WebHost.ConfigureKestrel(opts =>
{
    opts.Limits.MaxRequestBodySize = 104_857_600; // 100MB
    opts.Limits.KeepAliveTimeout =
        TimeSpan.FromMinutes(6); // > IIS requestTimeout
});

💡 记住这条线:IIS 的限制 < Kestrel 的限制。让 IIS 先拦住,不要让请求过了 IIS 才被 Kestrel 拒——那样 IIS 只能返回 502,日志还不好查。

还有第三个阴坑:MaxRequestBufferSize。Kestrel 默认 1MB 的请求缓冲区,如果你的请求 header 超过 1MB(比如带了一个超长的 cookie 或 token),Kestrel 直接拒绝连接,IIS 返回 502.3。解法是显式调大:

opts.Limits.MaxRequestBufferSize = null; // 不限制
opts.Limits.MaxRequestLineSize = 16_384; // 16KB

502 的排查,就三步: 看事件查看器 → 看 stdout 日志 → 对齐 IIS 和 Kestrel 的限制 日志在哪,问题就在哪。


收藏这篇,下次 502 不用猜。 三个配置对一遍,问题跑不掉。

关注 CSharp精选营,每周二四 get 能直接抄的 C# 实战。

阅读原文:IIS 后面挂 Kestrel,这 3 个配置错了就 502 - 码录集

ASP.NET Core应用在IIS上的部署原理与实战指南 在Web应用部署领域,反向代理是一种常见的架构模式,它通过在客户端与后端应用服务器之间设置一个中间层,来提升系统的安全性、可靠性和可管理性。其核心原理是代理服务器接收客户端请求,并根据规则将其转发给一个或多个后端服务器,同时处理SSL卸载、负载均衡、静态文件服务等通用功能。这一技术对于分离关注点、提升专业组件效率具有重要价值,尤其在企业级Web服务场景中应用广泛。ASP.NET Core应用的Kestrel服务器虽然高性能,但在直接面对公网时,常需借助成熟的反向代理服务器来处理外围事务。在Windows服务 阅读详情

相关推荐

保姆级教程:如何在Windows Server上用IIS部署.NetCore Web API项目

本文提供了一份详细的Windows Server IIS环境下部署.NetCore Web API项目的保姆级教程,涵盖环境准备、项目发布优化、IIS站点配置、数据库连接安全、性能调优及故障诊断等全流程。特别强调IIS与.NetCore的整合部署技巧,帮助开发者快速构建高效稳定的企业级Web服务。

weixin_29213827的博客 465

IIS 10 部署 .NET Core 8 应用:3步配置程序池与防火墙,避免 502.5 错误

本文详细介绍了在IIS 10上部署.NET Core 8应用的3步关键配置,包括程序池设置、防火墙规则和环境变量配置,帮助开发者避免常见的502.5错误。通过清晰的步骤说明和实用技巧,确保应用顺利运行并优化性能。

weixin_34221773的博客 429

Web开发:IIS服务器部署ASP.NET Core应用全流程实战

本文详细介绍了在IIS服务器上部署ASP.NET Core应用的全流程实战指南,包括环境准备、应用发布、安全加固和故障排查等关键步骤。通过配置IIS核心组件、安装.NET Core运行时和优化性能参数,帮助开发者高效完成Web应用的部署与运维,提升服务器运行效率。

weixin_31421613的博客 278

IIS反向代理部署ASP.NET Core:Kestrel配置与排错实战

反向代理是介于客户端与后端应用之间的一层关键网关,负责承接TLS终结、请求过滤、日志记录与进程守护等边缘职责。ASP.NET Core内置的Kestrel虽具备出色的HTTP处理能力,但其定位是应用宿主,直接暴露公网往往面临进程崩溃无法恢复、证书管理零散、安全防护不足等运维难题。IIS作为Windows Server上的成熟Web服务器,通过ASP.NET Core Module将请求转发至Kestrel,完美互补:IIS负责外部流量入口与生命周期管理,Kestrel专注业务请求处理。这种架构不仅适用于单站

weixin_33585822的博客 340

iis部署讲解和错误内容

一、部署 0、WIN_独立部署 1、WIN_IIS 部署,前后端不同站点 2、WIN_IIS 部署,前后端一个站点 3、WIN_Git_Nginx_Kestrel 部署 4、WIN 部署到 Windows 服务 5、Linux_Ubuntu_Nginx 部署 6、Linux_CentOs_Nginx 部署 7、Linux_Docker 部署 8、Docker+Jenkins部署,实现CI/CD 二、NetCore 错误 0、调试靠断点,部署靠日志 1、错误码 —— 405 2、错误

q1272816629的博客 2319

IIS 10.0 部署 ASP.NET Core 6.0 应用:3步配置与1个常见错误排查

本文详细介绍了在IIS 10.0上部署ASP.NET Core 6.0应用的3个关键配置步骤,包括环境准备、应用程序池设置和站点配置,并重点解决了常见的HTTP 500.19错误。通过清晰的步骤说明和实用代码示例,帮助开发者高效完成Web服务器配置,确保应用稳定运行。

348

IIS 作为反向代理:为 ASP.NET Core Kestrel 应用保驾护航

本文详细介绍了在Windows服务器环境下,如何将IIS配置为ASP.NET Core Kestrel应用的反向代理。主要内容包括:1)说明IIS作为反向代理的必要性,包括安全性增强、SSL终止、静态文件服务等优势;2)指导安装Application Request Routing(ARR)模块;3)详细配置IIS代理功能及URL重写规则;4)配置ASP.NET Core应用处理转发头信息;5)部署验证步骤和常见问题解决方案。该部署模式充分利用IIS的成熟功能,为ASP.NET Core应用提供安全高效的生

程序人生,算法世界 879

Windows Server 2016 IIS 10.0 网站部署全流程:从安装配置到ASP.NET Core/PHP实战

Web服务器是承载网站应用的核心基础设施,其核心原理在于监听网络请求、处理HTTP协议并返回响应。在Windows Server环境中,IIS(Internet Information Services)作为微软官方Web服务器,凭借其与Windows系统的深度集成、对ASP.NET等微软技术栈的天然支持以及成熟的管理工具,成为托管企业级Web应用的主流选择。其技术价值体现在为应用程序提供稳定、安全且高性能的运行环境,并通过应用程序池实现进程隔离与资源管理。典型的应用场景包括部署企业内部门户、电子商务平台、

weixin_34242509的博客 403

IIS反向代理Kestrel:ASP.NET Core部署架构实战指南

反向代理是Web架构中衔接客户端与应用服务器的关键中间层,负责请求转发、TLS终结与流量分发。在Windows Server环境下,IIS与Kestrel的组合是ASP.NET Core应用部署的经典模式:Kestrel作为内置跨平台服务器性能优秀,但直接暴露公网存在端口权限、运维功能缺失等短板;IIS借助ARR与URL Rewrite模块可将公网请求安全代理到本机Kestrel,同时提供HTTPS证书、日志分析、应用池保活等成熟能力。本文围绕环境准备、反向代理规则配置、Kestrel监听设置、HTTPS绑

weixin_32175665的博客 291

Vue3 + .NET 7.0 前后端分离部署:Nginx 反向代理与 systemd 实战

前后端分离架构下,前端静态资源托管与后端 API 服务的协同部署是上线环节的核心挑战。以 Vue3 与 Element Plus 构建的管理后台为例,其构建产物 dist 需要由 Nginx 高效托管,而基于 .NET 7.0 的 Web API 则通过 Kestrel 自宿主运行,最终由 Nginx 反向代理统一转发请求,形成一条清晰稳定的数据链路。这种分工模式不仅解决了跨域和端口暴露问题,还借助 systemd 守护进程实现后端服务的自动重启与开机启动。从环境初始化、前端构建、后端发布到代理配置,再到

weixin_26789847的博客 310

IIS替代方案实战:从Kestrel到Nginx反向代理迁移指南

Web服务器作为应用架构的入口,承担着请求转发、静态资源托管与进程管理等核心职责。当跨平台部署、配置复杂度成为痛点,IIS的替代需求日益凸显。理解反向代理与应用服务器的分工,是选型的基础。Kestrel作为ASP.NET Core内置的跨平台服务器,负责动态请求处理;Nginx凭借高并发与灵活配置,常作为前置网关。两者组合既能保留IIS的核心能力,又获得开源生态的灵活性。本文以实际迁移为主线,覆盖发布、Nginx配置、systemd托管、静态站点与容器化部署等场景,并针对502、404、WebSocket失

weixin_42665255的博客 207

基于 MarkItDown 的 DOCX 文档转 Markdown 实战解析——以 oTTomator ottomarkdown-agent 的本地转换测试输出为例

本文以 `ottomarkdown-agent` 仓库中真实的本地转换测试输出文件 `local_convert_test_docx.md` 为切入点,完整拆解 DOCX 文档是如何通过 MarkItDown 被转换为结构完整、可直接投喂给 LLM 的 Markdown 内容,覆盖转换流程、结构保真度验证、底层源码实现、测试体系与 API 调用方式。读完本文,你将掌握这套"文件上传 → Base6

gitblog_00028的博客 393

Dify插件离线部署全攻略:从下载到安装的完整流程

本文详细介绍了Dify插件离线部署的完整流程,针对企业内网等无网络环境需求。核心步骤包括在联网环境下载插件包、在特定Python 3.12.9环境下使用专用工具进行离线重打包,以及最终在离线Dify环境中安装验证。重点解决了离线安装的核心难题,并提供了环境配置、批量处理和故障排查等实用技巧,帮助用户实现Dify插件的顺利离线部署。

seed的博客 657

.NET 8 WebAPI 发布到 IIS 详细教程

本文档提供了将.NET 8 WebAPI部署到IIS的完整教程,主要包含以下步骤: 环境准备与前置检查 操作系统要求Windows 10/11或Server 2016+ 需要IIS 10+和.NET 8 Runtime+Hosting Bundle 管理员权限 IIS安装与配置 通过Windows功能或PowerShell安装IIS核心组件 需勾选必备功能如ISAPI扩展、静态内容等 安装.NET 8 Hosting Bundle 必须安装Hosting Bundle而不仅是Runtime 提供官方下载链接

m0_52522230的博客 458

EEGnet模型论文讲解(画图详解三种卷积层操作)

我录了一个讲解视频:https://www.bilibili.com/video/BV1si4y1s7g7/ 目录 一、整体介绍 二、梳理激活函数 三、图解三种卷积层 (核心内容) 四、总结 一、整体介绍 EEGnet是为专门一般的脑电图识别任务而设计的通用且紧凑的卷积神经网络。(设计思路借鉴了MobileNet) 下图是EEGnet的整体结构图,只有三个卷积模块,重点是depthwise conv 和separable conv这两个卷积模块。 表格表明了EEGnet的...

Amigo_1997的博客 2万+

从防御者视角复盘:用WinArpAttacker和Wireshark在Windows上模拟并检测ARP欺骗攻击

本文详细解析了Windows平台下的ARP欺骗攻击与防御策略,通过WinArpAttacker和Wireshark工具模拟攻击并检测异常流量。文章涵盖实验环境搭建、攻击原理深度解析、流量特征分析及企业级防御方案,帮助安全运维人员全面掌握ARP攻击检测与防护技术。

weixin_30918633的博客 121

HTTP Error 502.5 – Process Failure

https://www.cnblogs.com/lookerblue/p/7101641.htmlhttp://www.cnblogs.com/lookerblue/p/7102040.htmlhttp://www.cnblogs.com/lookerblue/p/8877597.html请安装:AspNetCore.2.0.7.RuntimePackageStore_x64.exeDotNetC...

weixin_34234721的博客 1121

信号系统核心概念:卷积、傅里叶变换与抽样定理的工程实践指南

信号与系统是理解现代电子、通信与数字处理技术的基石。其核心在于通过数学工具对物理世界进行建模与分析,其中卷积运算揭示了线性时不变系统对任意输入的响应可分解为冲激响应的叠加,这一原理极大提升了系统测试与分析的效率。而傅里叶变换则提供了从时域到频域的映射,将复杂的时域卷积运算转化为频域的简单乘法,是实现频谱分析、滤波设计的关键。抽样定理则架起了模拟与数字世界的桥梁,明确了无失真数字化的条件。这些基础理论共同构成了滤波器设计、音频处理、图像分析及通信系统等广泛工程应用的技术支柱。本文聚焦于卷积与傅里叶变换,结合冲

weixin_30788619的博客 629

asp.net core 2.1 部署IIS(win10/win7)

https://www.cnblogs.com/lenovo_tiger_love/p/9521159.html asp.net core 2.1 部署IIS(win10/win7) 概述 与ASP.NET时代不同,ASP.NET Core不再是由IIS工作进程(w3wp.exe)托管,而是使用自托管Web服务器(Kestrel)运行,IIS则是作为反向代理的角色转发请求到Kestrel不同端口的...

weixin_43553234的博客 534

uniapp [微信小程序] - 详解微信小程序端接入mqtt全流程及示例源码教程,uniApp微信小程序端如何接入MQTT插件并实现连接/断开+发布订阅+消息队列+离线重连等各种示例代码(开箱即用)

uniapp微信小程序接入MQTT,uniapp中使用mqtt,uniapp 微信小程序端接入mqtt示例代码教程,适用于微信小程序的MQTT插件,uniapp开发微信小程序连接mqtt,uniApp微信小程序接入MQTT协议,uniapp vue3微信小程序使用MQTT的小例子接入流程,使用uniapp开发小程序接入mqtt,如何在uniapp项目中使用mqtt,uniapp mqtt的使用示例,mqtt连接报错,如何在项目里集成mqtt,Mqtt协议,主动连接mqtt,订阅消息,实现发布,订阅和接收消息

🏆 前端领域优质创作者 2881

把 SAP S/4HANA 中的 Maintain Email Templates 用好:从模板维护、语言变体、业务绑定到传输治理的完整实践

摘要:SAP邮件模板管理常被低估,实则关乎审批通知、业务提醒等关键输出。官方推荐通过复制标准模板实现自定义,而非直接修改标准内容,以保持核心稳定。模板维护涉及语言变体、业务绑定、数据传输等治理环节,需业务顾问与开发团队协作确保字段来源与渲染逻辑。实施时需注意Fiori配置、权限分配及传输管理,避免测试与生产环境差异。模板设计应平衡灵活性与复杂度,遵循分层测试策略(内容、数据、流程),并建立命名规范以维护资产清晰度。(149字)

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 67

《ASP.NET Core 部署 IIS 常见端口冲突问题:原因分析与解决办法》

ASP.NET Core在IIS集成模式下应自动处理端口,无需手动指定。(如8080/8888)测试,确认无冲突后再切回80/443端口。两站点共享应用池,且未配置URL ACL。

2501_93893039的博客 392

手把手完整实现STM32+NB-IoT+MQTT+ThingsCloud云平台+手机APP(Android或iOS)及微信小程序及Web app 应用

本教程以远程温湿度显示及点灯作为示例。最终效果实现本地OLED显示屏、云平台和手机APP、微信小程序和Web App可远程查看温湿度数据,并可远程控制LED灯亮灭。以此完成基于MQTT协议的NB-IoT远程发布订阅数据,以此在本教程基础上可扩展开发更多的功能。

嵌入式阿齐Archie 2万+

ASP.NET Core 10 Minimal API 从入门到IIS部署实战指南

随着微服务和接口级开发的普及,构建轻量级HTTP接口成为前端对接、后台回调与内部工具链的常见需求。Minimal API作为ASP.NET Core提供的一种极简开发范式,无需Controller与Route特性,通过MapGet、MapPost等方法将HTTP请求直接绑定到处理逻辑,显著降低了代码组织成本。它在保留完整框架能力的同时,让开发者更快聚焦于接口实现,适合内网服务、运维平台及小规模业务场景。基于ASP.NET Core 10环境,实践创建Todo查询与写入接口,结合Swagger辅助调试,并完成

weixin_34167819的博客 408

【VTKExamples::PolyData】第十六期 GradientFilter

本文分享VTK样例GradientFilter,并解析接口vtkGradientFilter & vtkAssignAttribute,希望对各位小伙伴有所帮助!

qq_40041064的博客 319

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

Vue3+.NET7 Linux部署:Nginx反代与systemd托管

现代Web应用多采用前后端分离架构,由前端负责交互展示、后端提供API数据。生产部署的关键在于整合静态资源托管、请求转发与进程守护。Nginx作为反向代理服务器,可通过try_files回退前端history路由以消除刷新404,并对带hash的静态资源设置长缓存以加速访问;后端API则经由Nginx转发到本机Kestrel,避免额外端口暴露。以.NET Core编写的服务通过dotnet publish发布后,配合Linux systemd完成进程守护,可实现崩溃自动重启与开机自启,提升线上服务的可运维性

weixin_29717341的博客 327

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

上一篇: .NET 面试必问的 8 道 GC 题,建议收藏
下一篇: Blazor 里 JWT 过期,用户正下单就被踢
码农刚子.
博客等级 码龄8年 554粉丝 126原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

码农刚子.

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值