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

ASP.NET Core 8 Web API被.NET 8客户端调用返回400错误求助

排查.NET客户端调用ASP.NET Core API Authenticate接口返回400 Bad Request的问题

核心问题分析

你的API中Authenticate方法的参数是string lr,ASP.NET Core默认模型绑定规则会从查询字符串或表单字段读取该参数,但.NET客户端如果用PostAsJsonAsync这类方法发送JSON格式请求体,API无法正确获取lr参数,导致lr为空触发代码中的错误逻辑,同时请求格式不匹配会返回400状态码。而Swagger或JS调用时,是按照API预期的参数传递方式(表单/查询参数)发送请求,所以能正常工作。

解决方案

方案1:修改API参数绑定(推荐)

直接让API接收UserSignIn对象,并通过[FromBody]指定从请求体读取,同时省去手动反序列化步骤,代码更简洁且符合RESTful规范:

[AllowAnonymous]
[HttpPost("Authenticate")]
public async Task<UserLoginResponse> Authenticate([FromBody] UserSignIn usi)
{
    UserLoginResponse resp = new UserLoginResponse 
    { 
        Success = false, 
        ResultMessage = string.Empty, 
        UserToken = "",
        ResultCodes = LoginResponseCodes.UserNamePasswordRequired
    };

    if (string.IsNullOrEmpty(usi.Email) || string.IsNullOrEmpty(usi.Password))
    {
        resp.ResultMessage = "Valid User Name (email)/Password Required";
        return resp;
    }

    // 恢复注释的业务逻辑
    // resp = await _userService.Authenticate(usi);
    // if(resp == null)
    // {
    //     resp = new UserLoginResponse { Success = false, ResultMessage = "NULL Error", UserToken = "" };
    // }

    return resp;
}

对应的.NET客户端调用示例:

var client = new HttpClient();
var userSignIn = new UserSignIn { Email = "test@example.com", Password = "password" };
var response = await client.PostAsJsonAsync("https://your-api-domain/Authenticate", userSignIn);

// 读取响应内容查看详细错误信息
var responseContent = await response.Content.ReadAsStringAsync();

方案2:调整.NET客户端的参数传递方式(不修改API)

如果无法修改API,需要让客户端按照API预期的方式传递lr参数:

方式A:表单字段传递

var client = new HttpClient();
var userSignIn = new UserSignIn { Email = "test@example.com", Password = "password" };
var lrJson = JsonConvert.SerializeObject(userSignIn);

var formData = new FormUrlEncodedContent(new[]
{
    new KeyValuePair<string, string>("lr", lrJson)
});

var response = await client.PostAsync("https://your-api-domain/Authenticate", formData);
var responseContent = await response.Content.ReadAsStringAsync();

方式B:查询参数传递

var client = new HttpClient();
var userSignIn = new UserSignIn { Email = "test@example.com", Password = "password" };
var lrJson = JsonConvert.SerializeObject(userSignIn);
// 对JSON字符串进行URL编码,避免特殊字符导致的问题
var encodedLr = Uri.EscapeDataString(lrJson);

var response = await client.PostAsync($"https://your-api-domain/Authenticate?lr={encodedLr}", null);
var responseContent = await response.Content.ReadAsStringAsync();

额外排查建议

  • 启用API的日志记录,查看请求的Content-Type以及lr参数是否被正确接收。
  • 用Fiddler或浏览器开发者工具对比Swagger请求和.NET客户端请求的差异,重点看请求头、请求体内容。
  • 客户端调用时务必读取响应的字符串内容,API返回的UserLoginResponse会包含具体错误原因,能帮你快速定位问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.25 06:13:28