UWP中HttpListener无法监听:请求超时且回调仅Stop时触发求助
UWP中HttpListener无法正常监听的问题解决
问题描述
使用ToggleSwitch控件触发HttpListener启动,代码在控制台应用中可正常运行,但在UWP环境下出现以下问题:
- Postman请求
http://localhost:8023始终超时 GetContextCallBack仅在调用httpListener.Stop()时才会被触发
启动监听器的代码如下:
private void LaunchLocalServer(int port) { httpListener = new HttpListener(); httpListener.Prefixes.Add($"http://127.0.0.1:{port}/"); httpListener.Start(); httpListener.BeginGetContext(new AsyncCallback(GetContextCallBack), httpListener); } private void GetContextCallBack(IAsyncResult ar) { try { HttpListener _listener = ar.AsyncState as HttpListener; if (_listener.IsListening) { return; } HttpListenerContext context = _listener.EndGetContext(ar); _listener.BeginGetContext(new AsyncCallback(GetContextCallBack), _listener); HttpListenerResponse response = context.Response; response.StatusCode = (int)HttpStatusCode.OK; response.ContentType = "application/json;charset=UTF-8"; response.ContentEncoding = Encoding.UTF8; response.AppendHeader("Content-Type", "application/json;charset=UTF-8"); var abcOject = new { code = "200", description = "success", data = "time=" + DateTime.Now }; string responseString = JsonConvert.SerializeObject(abcOject, new JsonSerializerSettings() { StringEscapeHandling = StringEscapeHandling.EscapeNonAscii }); using (StreamWriter writer = new StreamWriter(response.OutputStream, Encoding.UTF8)) { writer.Write(responseString); writer.Close(); response.Close(); } } catch (Exception ex) { Log.Warn($"handle response failed {ex}"); } }
问题原因
- 回调函数逻辑完全倒置:在
GetContextCallBack中,判断条件if (_listener.IsListening)会在监听器正常运行时直接返回,导致永远无法处理请求;只有当监听器停止(IsListening为false)时,才会执行后续处理代码,这就是回调仅在Stop()时触发的根本原因。 - UWP沙箱权限缺失:UWP应用默认受沙箱限制,若未声明私有网络权限,无法监听本地网络请求。
修复方案
1. 修正回调函数逻辑
将GetContextCallBack中的判断条件修改为:
if (!_listener.IsListening) { return; }
这样只有当监听器已停止时才退出,正常监听时会继续处理请求并重新发起异步等待。
2. 添加UWP网络权限
在Package.appxmanifest中添加必要的网络权限:
- 打开应用的
Package.appxmanifest文件 - 切换到功能标签页,勾选:
- 私有网络(客户端和服务器)
- 互联网(客户端)
- 或直接编辑XML代码,在
<Capabilities>节点下添加:
<Capability Name="internetClient" /> <Capability Name="privateNetworkClientServer" />
内容的提问来源于stack exchange,提问作者Seaky Lone
相关产品推荐
相关产品推荐

