httplistener进程卡死问题

showlin 2015-02-25 11:13:49
手头有一个项目,由一个WinService,几个个Winform和控制台程序组成,windows服务上使用httpListener架设了一个服务器,几个Winform和控制台之间的通讯通过httpWebRequest和httpWebResponse发送请求和接收回复。总体的运行情况都比较正常。

但是,在某些机器上,偶尔会出现winform和控制台程序一直卡死在任务进程中,强制结束都无法结束的情况。排查之后发现,是Service里头的httpListener卡死导致,而且,当出现卡死的情况下,哪怕我另外再写一个测试用的程序,使用其他端口,调用HttpListerner.Start(),同样会导致测试程序进程卡死(表现为UI界面崩溃,任务管理器中进程存在,无法强制结束)。

想问一下,
1、这种问题该如何继续排查定位错误?
2、可能的解决思路会有哪些?

弃用HttpListener改用Socket或者是Pipe的成本太高了,大概需要重写约50个业务逻辑类,还包括整体的重新测试。

ps. 请不要告诉我httpListener.Start()是阻塞方法,要用后台线程执行,不能用UI线程执行这样的回答...

这种常识还是有一点的....
...全文
504 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
showlin 2015-02-25
  • 打赏
  • 举报
回复
引用 4 楼 sp1234 的回复:
[quote=引用 2 楼 showlin 的回复:] 我说常识的意思是,所有的阻塞方法都是在后台线程运行的,不存在在UI线程执行的情况,请各位不要回复这种解决方案
用哪个线程执行Start方法,跟它“卡死”无关。 HttpListener没有执行必要的BeginGetContext或者GetContext方法,就不可能获取消息。 获取消息之后才应该使用并发子线程去执行消息内容。不是只一个单线程的程序去处理 Http 服务。但是你并没有这方面说明。[/quote] 好吧,我再确认说明一下,对于服务端的每一个GetContext()获取到的HttpListenerContext都有封装了一个单独的后台线程进行处理,并且处理方法都进行了异常处理而且是线程安全的。
  • 打赏
  • 举报
回复
引用 2 楼 showlin 的回复:
我说常识的意思是,所有的阻塞方法都是在后台线程运行的,不存在在UI线程执行的情况,请各位不要回复这种解决方案
用哪个线程执行Start方法,跟它“卡死”无关。 HttpListener没有执行必要的BeginGetContext或者GetContext方法,就不可能获取消息。 获取消息之后才应该使用并发子线程去执行消息内容。不是只一个单线程的程序去处理 Http 服务。但是你并没有这方面说明。
  • 打赏
  • 举报
回复
引用 楼主 showlin 的回复:
想问一下, 1、这种问题该如何继续排查定位错误? 2、可能的解决思路会有哪些?
你能在自己的开发环境重现bug,这才可能做什么事情。不能重现,只知道描述“别人那里的现象”,这种连你自己都无法重现的问题只能放弃。你的描述没有什么实际有价值的内容,无法判断。
showlin 2015-02-25
  • 打赏
  • 举报
回复
引用 1 楼 sunzongbao2007 的回复:
1. UAC 2. 防火墙 3. 开启的最大端口数 4. 你说的那个常识,既然是常识……为啥不改 都检查一下。
确定权限是ok的,都申请了管理员权限 有出问题的机器和没出问题的机器防火墙都是关闭的,(有问题的时候,也是偶尔出现) 端口确定没有被占用 我说常识的意思是,所有的阻塞方法都是在后台线程运行的,不存在在UI线程执行的情况,请各位不要回复这种解决方案 这里真正让我诡异的是三点 1、bug不是必现的 2、任务管理器无法强制结束进程 3、出现bug后,其他任何程序无法启动HttpListener,哪怕是其他的空闲端口
铜臂阿铁木 2015-02-25
  • 打赏
  • 举报
回复
1. UAC 2. 防火墙 3. 开启的最大端口数 4. 你说的那个常识,既然是常识……为啥不改 都检查一下。

110,535

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧