You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

ASP.NET Core网站运行无响应问题求助(IIS+Kestrel环境)

兄弟,我之前也踩过IIS反向代理Kestrel后站点莫名挂掉的坑,给你整理几个实打实的排查方向,一步步来应该能搞定:

第一步:先抓关键日志,别瞎猜

站点无响应但VS没输出?那得看系统和应用的日志,这是最快定位问题的入口:

  • 打开事件查看器,依次展开Windows日志->应用程序,重点找来源为ASP.NET CoreKestrel或者W3SVC(IIS)的错误/警告日志。很多时候站点挂起是因为未捕获的异常导致进程崩溃,事件日志会给你明确的报错信息。
  • 检查应用自身的日志:赶紧把appsettings.json里的日志级别调到Debug或者Trace,如果用了Serilog/NLog这类第三方日志框架,一定要把日志输出到本地文件。重点看无响应前的最后几条日志,有没有线程阻塞、资源未释放的迹象。
  • 别忘了开Kestrel的标准输出日志:在web.config里把aspNetCore节点的stdoutLogEnabled设为truestdoutLogFile指定一个本地路径(比如.\logs\stdout),这样Kestrel的控制台输出会写到文件里,很多VS没捕获到的细节都在这里。
第二步:查资源占用,看是不是耗尽了

运行几分钟就挂,大概率是资源顶不住了:

  • 打开任务管理器,找到对应的dotnet.exe进程(就是Kestrel的进程),盯着内存、CPU、句柄数这三个指标:
    • 如果内存持续疯涨不回落,那肯定是内存泄漏了——比如数据库连接没释放、HttpClient没Dispose、静态集合一直在加数据没清理。
    • 如果CPU直接拉满,要么是代码里有死循环,要么是用了太多.Result/.Wait()这类同步阻塞操作,把线程池耗干了。
    • 句柄数过高的话,可能是文件、网络连接没关闭,系统资源被榨干了。
  • 嫌任务管理器不够细?用资源监视器(Resource Monitor),能看到进程的网络连接状态、打开的文件句柄,比如有没有大量TIME_WAIT的连接占着端口。
第三步:检查IIS和Kestrel的配置细节

反向代理的配置很容易藏坑:

  • 先看IIS应用程序池:.NET CLR版本必须设为无托管代码(ASP.NET Core不需要IIS托管,别选错了);再检查回收设置,是不是自动回收触发后没正常重启?不过你说重启IIS能跑几分钟,这个可能性不大,但还是确认下。
  • 核对web.config里的Kestrel配置:processPatharguments是不是指向了正确的程序和端口?有没有写错路径或者参数?
  • 检查Kestrel自身的配置:比如在Program.cs里有没有设置KeepAliveTimeout?如果超时设得太短,或者连接数限制太低,可能导致请求堆积挂起。
第四步:直接调试挂起的进程,揪出元凶

如果上面的方法没找到问题,直接上手调试挂着的进程:

  • 站点无响应时,打开Visual Studio,选调试->附加到进程,找到对应的dotnet.exe进程附加进去。
  • 附加后点调试->暂停,打开线程窗口,看看所有处于等待状态的线程:
    • 如果是在等锁(比如Monitor.Wait),那就是死锁了,顺着线程栈找对应的代码位置就行。
    • 如果是在等网络请求(比如HttpClient调用外部接口没返回),那就是外部服务挂了或者超时,把你的请求堵死了。
  • 还搞不定?就做内存转储:在任务管理器里右键dotnet.exe,选创建转储文件,然后用Visual Studio或者WinDbg分析转储,看内存里的对象、线程状态,内存泄漏和死锁一查一个准。
第五步:排查最近的环境变化

你说之前跑了8个月都没问题,近两周才出问题,那肯定是哪里变了:

  • 最近有没有更新ASP.NET Core runtime?或者升级了NuGet包?比如某个第三方包更新后引入了bug。
  • 服务器有没有装新软件、打补丁?比如防火墙、杀毒软件升级,把Kestrel的端口或者请求拦截了。
  • 站点访问量有没有突然暴涨?比如搞了活动,流量上来后资源不够用了。

总的来说,先从日志和资源占用入手,这两个是最高效的排查手段,大部分情况都能找到根因。如果还是不行,就用内存转储和线程调试,总能揪出问题。

内容的提问来源于stack exchange,提问作者Nicky

火山引擎 最新活动