Windows调用本地Web服务正常,Android端调用报400错误求助
错误信息
Error:
StatusCode: 400, ReasonPhrase: 'Bad Request', Version: 1.1, Content: System.Net.Http.StreamContent, Headers:
[DOTNET] {
[DOTNET] Connection: close
[DOTNET] Date: Fri, 21 Feb 2025 09:51:10 GMT
[DOTNET] Server: Microsoft-HTTPAPI/2.0
[DOTNET] X-Android-Received-Millis: 1740131468716
[DOTNET] X-Android-Response-Source: NETWORK 400
[DOTNET] X-Android-Selected-Protocol: http/1.1
[DOTNET] X-Android-Sent-Millis: 1740131465418
[DOTNET] Content-Length: 334
[DOTNET] Content-Type: text/html; charset=us-ascii
[DOTNET] }
客户端代码
public async Task<int> PostServiceint(string UR, object obj) { int bln = 0; try { foreach (var prop in obj.GetType().GetProperties()) { Console.WriteLine($"{prop.Name}: {prop.GetValue(obj)}"); } HttpClientHandler handler = new HttpClientHandler { // ServerCertificateCustomValidationCallback = HttpClientHandler.DangerousAcceptAnyServerCertificateValidator ServerCertificateCustomValidationCallback = (message, cert, chain, errors) => true }; using (var client = new HttpClient(handler)) { client.Timeout = TimeSpan.FromMinutes(10); Console.WriteLine(obj.ToString()); var response = client.PostAsJsonAsync(UR, obj).Result; var data = response.Content.ReadAsStringAsync().Result; Console.WriteLine(response); if (response.IsSuccessStatusCode) { string JsonString = response.Content.ReadAsStringAsync().Result; bln = Convert.ToInt32(JsonString); } } } catch (Exception ex) { Console.WriteLine(ex); } return bln; }
URL配置
- Windows端:
"http://localhost:2824/api/" + Controller + "/" + Method - Android端:
"http://10.0.2.2:2824/api/" + Controller + "/" + Method
问题背景
Windows本地运行应用时,可正常与localhost上的Web服务通信;但在Android设备上运行同一应用,调用Web服务返回400错误,调试后无法解决,需解决方案。
排查与解决方案建议
修正Web服务绑定地址
默认ASP.NET Core服务可能仅绑定localhost,导致Android模拟器的10.0.2.2无法访问。修改服务配置,让其监听所有网卡:- 在Program.cs(.NET 6+)中添加:
var builder = WebApplication.CreateBuilder(args); builder.WebHost.ConfigureKestrel(options => { options.ListenAnyIP(2824); // 监听所有IP的2824端口 }); - 或在launchSettings.json中,将
applicationUrl设为http://0.0.0.0:2824;http://localhost:2824
- 在Program.cs(.NET 6+)中添加:
统一JSON序列化规则
Android与Windows端的PostAsJsonAsync可能存在序列化差异(如大小写、空值处理):- 在Android端打印序列化后的JSON,对比Windows端请求内容:
var json = JsonSerializer.Serialize(obj); Console.WriteLine(json); - 若API要求驼峰命名,客户端需配置序列化规则:
var options = new JsonSerializerOptions { PropertyNamingPolicy = JsonNamingPolicy.CamelCase }; var response = await client.PostAsJsonAsync(UR, obj, options); - 替换代码中的
.Result为await,避免异步操作死锁:var response = await client.PostAsJsonAsync(UR, obj); var data = await response.Content.ReadAsStringAsync();
- 在Android端打印序列化后的JSON,对比Windows端请求内容:
查看Web服务详细日志
400错误多为请求格式问题,开启服务详细日志获取具体原因:- 在appsettings.json中调整日志级别:
{ "Logging": { "LogLevel": { "Default": "Information", "Microsoft.AspNetCore": "Debug" } } }
- 在appsettings.json中调整日志级别:
检查网络与防火墙
- 在Android模拟器中执行
ping 10.0.2.2,确认网络连通 - 配置Windows防火墙,允许2824端口的入站HTTP请求
- 在Android模拟器中执行
验证URL一致性
确保Android端生成的URL路径(Controller、Method名称)与Windows端完全一致,注意Web API路由是否区分大小写。
内容的提问来源于stack exchange,提问作者Pulkit Bajpai

