如何让System.Net.HttpListener长期运行,是否有更合适的实现方案?
概念实现思路
异步监听方案说明
HttpListener.BeginGetContext完全可以满足你的需求,适配.NET Framework 4.0 + Win7的运行环境,替换同步GetContext方法即可解决主线程阻塞问题,无需额外引入第三方组件。- 采用回调链式触发的监听模式:启动HttpListener并完成前缀绑定后,第一次调用
BeginGetContext注册请求处理回调;当有请求进入时回调被自动触发,你在回调内部完成单端点校验、JSON payload解析、响应返回等逻辑后,立刻再次调用BeginGetContext注册下一次监听,即可实现持续无阻塞的请求接收。 - 单端点校验逻辑可放在回调开头执行:仅放行你指定路径、指定请求方法(如POST)的请求,其余请求直接返回404/405状态码即可,不需要多余处理。
TopShelf服务适配要点
- 直接将HttpListener的生命周期和TopShelf的服务启停逻辑绑定即可:在TopShelf的服务启动回调中完成HttpListener的初始化、前缀注册、启动操作,再执行第一次
BeginGetContext调用启动监听;在TopShelf的服务停止回调中调用HttpListener的Stop方法结束监听,再释放对应资源即可,不会出现资源泄漏问题。 - 不需要额外做多线程管理,
BeginGetContext的回调会自动由.NET线程池调度执行,对于IIoT场景下的低频次简单消息接收需求,性能完全够用。
内容的提问来源于stack exchange,提问作者scottmwyant
相关产品推荐
相关产品推荐

