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

Windows调用本地Web服务正常,Android端调用报400错误求助

问题:Android设备调用本地Web服务返回400 Bad Request错误

错误信息

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错误,调试后无法解决,需解决方案。


排查与解决方案建议

  1. 修正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
  2. 统一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();
      
  3. 查看Web服务详细日志
    400错误多为请求格式问题,开启服务详细日志获取具体原因:

    • 在appsettings.json中调整日志级别:
      {
        "Logging": {
          "LogLevel": {
            "Default": "Information",
            "Microsoft.AspNetCore": "Debug"
          }
        }
      }
      
  4. 检查网络与防火墙

    • 在Android模拟器中执行ping 10.0.2.2,确认网络连通
    • 配置Windows防火墙,允许2824端口的入站HTTP请求
  5. 验证URL一致性
    确保Android端生成的URL路径(Controller、Method名称)与Windows端完全一致,注意Web API路由是否区分大小写。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.14 08:47:39