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

.NET 7 MAUI在Mac上发送HTTP请求无响应问题求助

问题解决:Mac上.NET 7 MAUI HTTP请求无响应,控制台程序正常

核心原因分析

  1. macOS沙箱权限限制:MAUI macOS应用受系统沙箱机制约束,默认可能未授权网络访问,或禁止HTTP(非HTTPS)请求;而控制台程序不受沙箱限制,因此能正常运行。
  2. URL参数错误:服务代码中autocomplete_endpoint的language{2}缺少等于号,导致生成的URL格式无效,MAUI中异步异常可能被静默吞掉,无报错提示。
  3. Async Void的异常处理问题:按钮点击事件用async void,MAUI中这类方法的异常不会被默认捕获,导致请求失败却无任何反馈。

分步解决方案

1. 配置macOS网络权限与ATS例外

打开项目中Platforms/MacOS/Info.plist,添加以下配置:

  • 允许非HTTPS请求(如果使用HTTP接口):
<key>NSAppTransportSecurity</key>
<dict>
    <key>NSAllowsArbitraryLoads</key>
    <true/>
</dict>
  • 添加网络访问权限说明(系统要求必须提供):
<key>NSNetworkUsageDescription</key>
<string>需要访问网络获取天气数据</string>

2. 修复URL参数错误

修改服务代码中的autocomplete_endpoint常量,补充language参数的等于号:

private const string autocomplete_endpoint = "locations/v1/cities/autocomplete?apikey={0}&q={1}&language={2}";

3. 修正异步事件处理与异常捕获

将按钮点击的async void改为带异常捕获的逻辑,避免异常静默丢失:

private async void OnCounterClicked(object sender, EventArgs e)
{
    try
    {
        City[] cities = await service.GetLocations("Berlin");
        Console.WriteLine("Got: " + cities[0].LocalizedName);
    }
    catch (Exception ex)
    {
        Console.WriteLine($"请求失败: {ex.Message}");
        await DisplayAlert("请求错误", ex.Message, "确定");
    }
}

4. 优化HttpClient复用

建议在服务类中复用HttpClient,而非每次请求创建新实例(提升性能并避免端口耗尽):

internal class AccuWeatherService : IAccuWeatherService
{
    private readonly HttpClient client;

    private const string base_url = "http://dataservice.accuweather.com";
    private const string autocomplete_endpoint = "locations/v1/cities/autocomplete?apikey={0}&q={1}&language={2}";

    string api_key = "correctly";
    string language = "pl";

    public AccuWeatherService()
    {
        client = new HttpClient();
    }

    public async Task<City[]> GetLocations(string locationName)
    {
        string uri = base_url + "/" + string.Format(autocomplete_endpoint, api_key, locationName, language);
        Console.WriteLine("Calling for cities: " + uri);

        using (var r = await client.GetAsync(uri))
        {
            // 确保请求成功,否则抛出异常
            r.EnsureSuccessStatusCode();
            
            string json = await r.Content.ReadAsStringAsync();
            Console.WriteLine("Got json for cities: " + json);
            City[] cities = JsonSerializer.Deserialize<City[]>(json);
            return cities;
        }
    }
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.07 17:05:54