OWIN启动完成后立即自动关闭,请问该现象的原因是什么?
问题:启动完成后应用立即关闭的原因
简化后的Startup代码
public class Startup { public void Configuration(IAppBuilder app) { RegisterOnShutdown(app); Log.Debug("\n Startup end !!!"); } private void RegisterOnShutdown(IAppBuilder app) { var context = new OwinContext(app.Properties); var token = context.Get<CancellationToken>("host.OnAppDisposing"); if (token != CancellationToken.None) { token.Register(OnShutdown); } } private void OnShutdown() { Log.Debug("\n Shutdown !!!"); } }
日志输出
2022-12-11 08:00:27,045 [1] DEBUG (null) Web.Startup [(null)] <(null)> - Startup end !!! 2022-12-11 08:00:29,751 [7] DEBUG (null) Web.Startup [(null)] <(null)> - Shutdown !!!
原因分析
这种启动后立即关闭的现象,最常见的原因是OWIN宿主进程没有被保持活跃状态。你的Startup代码本身没有问题,但如果宿主(比如控制台宿主)在启动应用后没有阻塞主线程,进程就会直接退出,触发host.OnAppDisposing令牌,从而执行你的OnShutdown方法。
比如,如果你的宿主启动代码是这样的,就会导致进程直接退出:
using (WebApp.Start<Startup>("http://localhost:8080")) { // 无任何阻塞逻辑,程序执行到此处直接结束using块,释放宿主 }
解决办法是在启动宿主后添加阻塞逻辑,比如控制台应用里加入Console.ReadLine()来保持主线程运行:
using (WebApp.Start<Startup>("http://localhost:8080")) { Console.WriteLine("应用已启动,按任意键退出..."); Console.ReadLine(); }
其他可能的次要原因包括:
- 宿主配置错误,比如未正确绑定端口或缺少必要的宿主依赖
- IIS应用池的回收策略被错误配置,但从日志的时间间隔来看,更可能是控制台宿主未保持活跃的问题
内容的提问来源于stack exchange,提问作者Yusif
相关产品推荐
相关产品推荐

