症状
折磨了我一整天,在单独的console application下好好的,集成到一块就在 bootstrap.BindAsync()处抛出 ClosedChannelException “I/O error occurred" 异常,也没有其他有价值的信息了。集成环境与console app的区别有3处:
- 集成环境是在asp.net core3.1中;
- 集成环境是通过反射加载的;
- 集成环境中,还有一个地方用到了Dotnetty。
分析
- 是不是 asp.net core 不支持udp server(我用Dotnetty来开启udp server)? 答案是支持;
- 是不是Dotnetty对内存啥的有限制?这个在unity论坛上有人问,Dotnetty本身不存在这个问题;
- 是不是反射创建udp server这个操作异端了?以前也这么干过啊...wtf
跟踪
把引用Dotnetty的nuget都换成github代码编译后的本地dll引用,这样可以跟踪到Dotnetty里面的异常,然并卵,在console app下可以跟进去,在集成环境中就是跟不进去。我观察两者生成的dll文件,发现了不同:
console app引用的Dotnetty*.dll文件居然与集成环境的不一样?!原来集成环境中,另一处使用Dotnetty是通过nuget,console app引用的是本地编译后的,并且nuget的覆盖了本地编译的,造成了版本冲突!从ClosedChannelException 怎么也想不到是这个问题啊。
解决办法
确保所有引用的 Dotnetty*.dll 均同源,再运行就好了。