You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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}");
    }
}

问题原因

  1. 回调函数逻辑完全倒置:在GetContextCallBack中,判断条件if (_listener.IsListening)会在监听器正常运行时直接返回,导致永远无法处理请求;只有当监听器停止(IsListening为false)时,才会执行后续处理代码,这就是回调仅在Stop()时触发的根本原因。
  2. 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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.13 15:45:50