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

Xamarin Android应用无法连接MVC Core Web API求助

问题解决:Xamarin Android调用ASP.NET Core Web API出现"No such host is known"异常

核心问题分析

你遇到的No such host is known本质是模拟器无法连接到宿主机器上的Web API服务,再加上异步代码的错误使用放大了问题。以下是分步解决方案:


1. 修复异步代码的死锁问题

代码中使用.Result阻塞UI线程会导致死锁,同时掩盖真实的网络错误,必须替换为await:

修正后的按钮点击事件代码

private async void btnRegisterClicked(object sender, EventArgs e)
{
    try
    {
        HttpClientHandler insecureHandler = GetInsecureHandler();
        // 建议复用HttpClient,不要每次创建新实例
        using HttpClient httpClient = new HttpClient(insecureHandler);
        
        AppUserRegistrationModel user = new AppUserRegistrationModel
        {
            user_fullname = entName.Text,
            user_email = entEmail.Text,
            phone_number = long.Parse(entPhoneNumber.Text),
            alternative_number = long.Parse(entPhoneNumber.Text),
            address = entAddress.Text,
            city = entCity.Text,
            district = entDistrict.Text,
            state = entState.Text,
            pincode = Int32.Parse(entPinCode.Text),
            gender_id = 1,
            aadhar_number = long.Parse(entAadharNumber.Text),
            dob = dtDOB.Date,
            blood_group_id = 2,
            registration_time = DateTime.Now,
            username = entUserName.Text,
            password = entPassword.Text,
            is_user_active = true
        };

        var userPostData = JsonConvert.SerializeObject(user);
        var byteContent = new StringContent(userPostData, Encoding.UTF8, "application/json");
        
        // 用await替代.Result,避免死锁
        HttpResponseMessage resp = await httpClient.PostAsync("http://10.0.2.2:7137/api/HospitalCategoryModels", byteContent); 

        if (resp.IsSuccessStatusCode)
        {
            string strs = await resp.Content.ReadAsStringAsync();
            AppUserRegistrationModel userReg = JsonConvert.DeserializeObject<AppUserRegistrationModel>(strs);
            // 可添加注册成功后的逻辑,比如提示用户
        }
        else
        {
            // 处理请求失败的情况,比如打印错误信息
            string errorMsg = await resp.Content.ReadAsStringAsync();
            // 可弹窗提示用户
        }

        await Navigation.PushModalAsync(new MainPage());
    }
    catch (Exception ex)
    {
        // 捕获异常方便调试
        Console.WriteLine($"请求异常:{ex.Message}");
        // 可弹窗提示用户
    }
}

public HttpClientHandler GetInsecureHandler()
{
    HttpClientHandler handler = new HttpClientHandler();
    handler.ServerCertificateCustomValidationCallback = (message, cert, chain, errors) =>
    {
        // 开发环境临时信任localhost证书,生产环境必须移除
        if (cert?.Issuer.Equals("CN=localhost") == true)
            return true;
        return errors == System.Net.Security.SslPolicyErrors.None;
    };
    return handler;
}

2. 排查API服务的可达性

验证端口与地址

  • 确认ASP.NET Core Web API的运行端口:查看项目的launchSettings.json,或启动API后控制台输出的URL(比如Now listening on: http://localhost:7137)。
  • 测试模拟器能否访问宿主机器:在模拟器终端执行ping 10.0.2.2,若无法ping通,重启模拟器或检查Hyper-V/模拟器网络设置。
  • 若使用真实Android设备,将10.0.2.2替换为宿主机器的局域网IP(比如192.168.1.100),并确保设备和电脑在同一WiFi网络下。

防火墙设置

  • 关闭电脑防火墙测试,或在防火墙中添加允许Web API端口(7137)的入站规则。

3. 配置Android网络权限

在Android项目的AndroidManifest.xml中添加以下配置:

<!-- 网络权限 -->
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />

<!-- Android 9+允许明文HTTP请求(开发环境用,生产环境建议用HTTPS) -->
<application ... android:usesCleartextTraffic="true">
    <!-- 其他配置 -->
</application>

4. HTTPS相关优化(如果API使用HTTPS)

  • 若API启用了HTTPS,确保模拟器信任API的证书:可将证书安装到模拟器中,或调整ServerCertificateCustomValidationCallback逻辑。
  • 开发环境可暂时使用HTTP,但生产环境必须切换到HTTPS。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.18 17:53:09