ASP.NET Core HttpClient请求WebAPI返回200但接口实际返回406问题
问题核心原因
你的API端写法存在根本性错误,你自行创建的HttpResponseMessage对象根本没有作为实际HTTP响应返回,最终输出的HTTP响应状态码是框架默认的200:
- 你定义的接口返回类型是
string,不管你在方法内构造了什么状态的HttpResponseMessage对象,最后只返回了该对象状态码的字符串值,这个字符串只会作为响应体内容返回,不会修改实际HTTP响应的状态码 - 你在API端控制台打印的只是你自己构造的本地对象的值,不是框架实际发回给客户端的HTTP响应属性
修复方案
1. 修改API端接口返回类型与返回逻辑
将返回类型改为IActionResult,直接返回对应状态码的结果即可:
[HttpPost] public IActionResult Login(object data) { UserLogin credentials = JsonConvert.DeserializeObject<UserLogin>(data.ToString()); Console.WriteLine(credentials.Username + " " + credentials.Password); // 注意:原有登录逻辑有严重安全问题,不要分开查询用户名和密码,要校验同一个用户是否同时匹配两个字段 User validUser = db.Users.FirstOrDefault(user => user.Username == credentials.Username && user.Password == credentials.Password); if (validUser != null) { return Ok(); // 对应200状态码 } else { return StatusCode(StatusCodes.Status406NotAcceptable); // 对应406状态码 } }
额外提醒:不要明文存储用户密码,生产环境必须存储加盐哈希后的密码。
2. 优化客户端判断逻辑
不要依赖ReasonPhrase判断响应状态,直接判断StatusCode属性更可靠:
if (response.StatusCode == HttpStatusCode.OK) { redirectPage = "Success"; } else { Console.WriteLine("Bad Login"); redirectPage = "LoginPage"; }
内容的提问来源于stack exchange,提问作者jk819
相关产品推荐
相关产品推荐

