如何解决Xamarin调用HttpWebRequest.GetRequestStream时出现ConnectFailure错误
问题根因与解决方案
你遇到的ConnectFailure错误核心触发原因和对应修复方案如下:
1. 地址配置错误
你当前使用http://localhost作为接口地址,Postman在你的开发电脑上运行,访问本地部署的接口自然正常,但Xamarin应用运行在模拟器/真机上时,localhost指向的是运行应用的设备本身,而非你的开发电脑,因此无法建立连接。
修复方式:
- 安卓模拟器场景:将
localhost替换为10.0.2.2,这是安卓模拟器内置的指向开发主机的特殊IP - iOS模拟器场景:直接使用开发电脑的本地IP即可,iOS模拟器共享主机网络栈
- 真机场景:确保真机和开发电脑处于同一局域网,将
localhost替换为开发电脑的局域网IP,同时关闭电脑防火墙或放开接口对应端口的访问权限
2. 明文流量限制适配
安卓9及以上、iOS新版本默认禁止HTTP明文流量访问,你当前使用HTTP协议需要额外配置权限:
- 安卓端:在
AndroidManifest.xml的application节点添加属性android:usesCleartextTraffic="true" - iOS端:在
Info.plist中添加NSAppTransportSecurity配置,开放对应域名的HTTP访问权限
3. 代码优化建议
HttpWebRequest属于已被官方弃用的API,Xamarin平台更推荐使用HttpClient实现网络请求,异步写法更适配Xamarin的UI异步逻辑,参考代码如下:
// 建议将HttpClient声明为静态全局对象,避免重复实例化造成资源浪费 private static readonly HttpClient _httpClient = new HttpClient(); private async void btnbuscar_Clicked(object sender, EventArgs e) { try { // 替换为调整后的正确接口地址 string url = "http://10.0.2.2/XXX/XX"; var postData = new Dictionary<string, string> { {"desc", txtdesc.Text} }; var content = new FormUrlEncodedContent(postData); // 异步发起POST请求 var response = await _httpClient.PostAsync(url, content); if (response.IsSuccessStatusCode) { string responseText = await response.Content.ReadAsStringAsync(); var msjdes = JsonConvert.DeserializeObject<List<RootListObject>>(responseText); listparts.ItemsSource = msjdes; } else { await DisplayAlert("Mensaje", "接口请求失败", ""); } } catch (Exception ex) { await DisplayAlert("Error", ex.Message, "OK"); } }
内容的提问来源于stack exchange,提问作者Manny
相关产品推荐
相关产品推荐

