asp.net 启动后重启 端口被占用 Global.asax 以及Application_End

发布时间 2023-12-15 16:06:03作者: WmW

最近在维护一个老的asp.net项目

最开始发现一个诡异的现象,那就是本地调试的时候这个项目经常在启动后莫名其妙的重启

逐步调试发现原来是该项目会监听一个本地端口,项目重启时会出现端口被占用的情况,为了保证端口不会占用,会先判断一下端口的情况,如果发现端口被占用,就强制杀掉占用该端口的进程,这就出现了启动程序后杀掉自己释放端口然后重启的诡异现象

虽然一定程度上解决了端口占用的问题,但是感觉很丑陋

而端口被占用的问题的根本原因是上次程序退出时没有及时的释放端口,如果能解决这个问题,不就不用去强制杀进程了吗

asp.net的Global.asax中有个Application_End,这个事件从名字上看是程序结束的时候触发的,我们可以试试在这里手动释放端口

于是我在Global.asax中定义了字段并将其指向了监听服务对象,然后在Application_End调用其Dispose,希望能在程序关闭的时候保证释放端口

但是我发现每次执行到Application_End时就报错,说是监听服务对象为空,原来是在触发Application_End时,Global.asax的非静态成员都已经释放为null了,网上搜到的关于Application_End的描述说的是:在HttpApplication 类的最后一个实例被销毁时,该事件被触发。在一个应用程序的生命周期内它只被触发一次。

因此咱们不能使用Global的实例成员来引用监听服务对象,于是我将其改成Global的静态成员,然后就不报错了,测试了下也没有出现端口占用的情况了