VS2019开发安卓应用Release模式调用WebAPI返回状态码0如何解决
返回状态码0通常代表请求未成功发送到服务端,被客户端系统层面拦截,可按以下顺序排查解决:
1. 配置允许明文HTTP请求
安卓9(API Level 28)及以上版本默认禁止应用发起明文HTTP请求,Debug模式下部分开发模板会默认开启android:usesCleartextTraffic权限,Release模式下该配置会被重置为默认值false,导致请求直接被系统拦截。
解决方法:
打开AndroidManifest.xml文件,在application节点添加属性:
<application android:usesCleartextTraffic="true"> <!-- 其余原有配置保持不变 --> </application>
2. 检查网络权限配置
部分Xamarin.Android项目模板会在Debug模式下自动授予INTERNET权限,Release模式需要手动显式声明权限:
同样在AndroidManifest.xml的根节点下添加权限声明:
<uses-permission android:name="android.permission.INTERNET" />
3. 配置链接器跳过相关程序集裁剪
Release模式默认会开启托管代码链接器裁剪,移除未被显式引用的类和成员,可能会裁剪掉RestSharp以及System.Net.Http相关的依赖代码,导致请求执行异常。
解决方法:
右键安卓项目 -> 属性 -> 安卓选项 -> 链接器,配置链接行为为「仅裁剪SDK程序集」,如果还是有问题,可以添加跳过裁剪的程序集配置,将RestSharp和System.Net.Http添加到跳过裁剪列表。
也可以直接在项目文件中添加配置:
<AndroidLinkSkip>RestSharp;System.Net.Http</AndroidLinkSkip>
4. 调整RestSharp调用写法
你当前使用的是RestSharp旧版同步Execute方法,安卓高版本不允许在主线程执行同步网络请求,Debug模式下可能默认禁用了主线程网络检查,Release模式下该检查生效会导致请求被终止。
可以改成异步调用写法:
public static async Task<string> FetchDB() { try { var client = new RestClient("http://192.168.2.200:8008/ecmiddleware/middleware/getstats"); client.Timeout = -1; var request = new RestRequest(Method.POST); IRestResponse response = await client.ExecuteAsync(request); if (response.StatusCode == System.Net.HttpStatusCode.OK) return response.Content; else return $"Not found \n{client.BaseUrl.AbsoluteUri}\n{DateTime.Now}\n{response.StatusCode}:{response.StatusDescription}"; } catch (Exception ex) { return ex.Message; } }
调用该方法时注意用await异步等待,不要阻塞主线程。
5. 调整TLS配置
右键安卓项目 -> 属性 -> 安卓选项 -> 高级,将「SSL/TLS实现」设置为「Native TLS 1.2+」,避免因为协议版本不兼容导致请求失败。
内容的提问来源于stack exchange,提问作者S.ATTA.M

