You need to enable JavaScript to run this app. Mac版Visual Studio开发Xamarin应用时HttpClient.GetAsync始终无返回的问题
优惠活动
大模型
产品
解决方案
定价
更多

Mac版Visual Studio开发Xamarin应用时HttpClient.GetAsync始终无返回的问题

问题根因

你碰到的GetAsync永久挂起、无异常抛出的现象,是Xamarin.iOS开发中最高发的网络配置问题,和Mac防火墙、VS本身的安装状态无关——核心是iOS系统默认开启的应用传输安全(ATS)机制拦截了你发起的明文HTTP请求。
iOS 9.0之后系统默认禁止所有应用发起非HTTPS的明文HTTP请求,Xamarin封装的原生网络栈碰到这类拦截时,不会主动抛出异常,只会把请求永久挂起,就会出现你看到的:方法行不返回、应用卡在启动阶段、线程池不停启停的现象。Windows桌面应用没有这套ATS限制,所以同一份代码在Windows上跑完全正常,迁移到iOS平台就会触发拦截。

分步解决与排查
  • 第一步:修正HttpClient的栈配置
    打开Xamarin.iOS项目的属性面板,进入iOS 选项 -> 高级页面:
    • 确认HttpClient实现选择的是NSUrlSession(基于iOS原生的网络栈,兼容性最好)
    • 不要选择Managed或者CFNetwork模式的HttpClient,这类栈在Mac开发环境下经常出现请求无响应的问题
  • 第二步:给目标域名添加ATS明文访问例外
    因为你调用的http://webcode.me是明文HTTP地址,必须单独在项目配置里放开权限:
    打开项目内的Info.plist文件,添加如下配置节点:
    <key>NSAppTransportSecurity</key>
    <dict>
      <key>NSExceptionDomains</key>
      <dict>
        <key>webcode.me</key>
        <dict>
          <key>NSIncludesSubdomains</key>
          <true/>
          <key>NSExceptionAllowsInsecureHTTPLoads</key>
          <true/>
        </dict>
      </dict>
    </dict>
    
    注意不要直接配置全局允许所有明文HTTP访问,这种配置会导致后续App打包上架时被审核直接驳回,只给实际需要调用的业务/测试域名单独添加例外即可。
  • 第三步:给HttpClient补充超时与状态校验逻辑
    你当前的代码没有设置任何超时规则,哪怕后续碰到网络异常、系统拦截,请求都会永久挂起,无任何报错。调整后的参考代码:
    using (var myClient = new HttpClient())
    {
        // 设置基础超时阈值,避免无期限等待
        myClient.Timeout = TimeSpan.FromSeconds(10);
        myClient.DefaultRequestHeaders.Accept.Clear();
        myClient.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
        // 用取消令牌兜底,极端场景下主动终止请求
        using var cts = new CancellationTokenSource(TimeSpan.FromSeconds(10));
        HttpResponseMessage response = await myClient.GetAsync(url, cts.Token);
        // 主动校验响应状态,4xx/5xx错误直接抛出异常,不会静默挂起
        response.EnsureSuccessStatusCode();
        string result = await response.Content.ReadAsStringAsync();
        return result;
    }
    
  • 第四步:排查代理/VPN干扰
    • 打开Mac系统设置 -> 网络 -> 高级 -> 代理,确认没有勾选任何未生效的HTTP/HTTPS代理,如果代理本身配置有误,会直接导致网络请求永久挂起,和防火墙状态无关
    • 暂时关闭Mac上运行的VPN、全局网络加速类工具,这类工具如果运行异常,会导致iOS模拟器(和Mac共享网络链路)的所有网络请求卡住,日志里刷线程启停的信息就是请求在不断重试的表现
可忽略的无关日志

你在输出窗口看到的如下日志,都是系统运行的正常输出,不是导致请求卡住的原因:

  • SecTaskLoadEntitlements failed error=22:模拟器调试时的权限校验常规提示,不影响运行
  • nw_protocol_get_quic_image_block_invoke dlopen libquic failed:系统网络栈的可选组件加载提示,没有实际影响
  • 大量线程启停的日志:是挂起的请求在不断触发线程池调度的正常表现,不是程序崩溃

内容的提问来源于stack exchange,提问作者zorci

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.25 02:24:07