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
相关产品推荐
相关产品推荐

