ASP.NET Core HttpClient 请求在 webapi 返回 406 时返回 200
Posted
技术标签:
【中文标题】ASP.NET Core HttpClient 请求在 webapi 返回 406 时返回 200【英文标题】:ASP.NET Core HttpClient request returns 200 when webapi returns 406 【发布时间】:2021-06-08 23:21:28 【问题描述】:我正在尝试使用 httpclient 发布请求进行简单登录,但客户端仅返回 200 而不是其他凭据错误的任何内容。以下是我的代码
消费者方面
[HttpPost("/login")]
public async Task<IActionResult> Login(LoginUser loginUser)
string redirectPage = "LoginPage";
// string result = "";
using (var client = new HttpClient())
client.BaseAddress = new Uri("http://localhost:5000/webapi");
client.DefaultRequestHeaders.Accept.Clear();
client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
HttpResponseMessage response = await client.PostAsJsonAsync("login", loginUser);
Console.WriteLine(response);
if (response.ReasonPhrase == "OK")
redirectPage = "Success";
else
Console.WriteLine("Bad Login");
redirectPage = "LoginPage";
API 端
[HttpPost]
public string Login(object data)
HttpResponseMessage loginResponse;
UserLogin credentials = JsonConvert.DeserializeObject<UserLogin>(data.ToString());
Console.WriteLine(credentials.Username + " " + credentials.Password);
User dbUser = db.Users.FirstOrDefault(user => user.Username == credentials.Username);
User dbUserPw = db.Users.FirstOrDefault(user => user.Password == credentials.Password);
if (dbUser != null && dbUserPw != null)
loginResponse = new HttpResponseMessage(HttpStatusCode.OK);
else
loginResponse = new HttpResponseMessage(HttpStatusCode.NotAcceptable);
Console.WriteLine(loginResponse);
return loginResponse.StatusCode.ToString();
当我尝试使用不正确的凭据登录时
API端返回
StatusCode: 406, ReasonPhrase: 'Not Acceptable', Version: 1.1, Content: <null>, Headers:
但客户端返回
StatusCode: 200, ReasonPhrase: 'OK', Version: 1.1, Content: System.Net.Http.HttpConnectionResponseContent, Headers:
Date: Tue, 08 Jun 2021 23:12:48 GMT
Server: Kestrel
Transfer-Encoding: chunked
Content-Type: application/json; charset=utf-8
有人知道问题出在哪里吗?
【问题讨论】:
would anyone know what the problem would be?
您没有从Login
返回 406。该软件并不神奇,它不知道您想这样做。你需要实际去做。
我也不相信您返回的是 406。我认为您返回的是 300有效载荷中的值为 406。
以上登录代码是同一个项目的吗?同一个控制器?即使 API 返回 406,第一次登录操作也只会返回 200 状态....如果 API 返回 406,您需要更改响应的状态码。
【参考方案1】:
根据您的描述,我发现您的响应类型是字符串,您只是返回一个字符串响应给客户端。
这就是为什么你总是得到 200 个状态码的原因。
如果你想返回406状态码,我建议你可以使用ContentResult
而不是IActionResult
。
[HttpPost]
public IActionResult Login(object data)
return new ContentResult() Content = "aaa", StatusCode = (int?)HttpStatusCode.NotAcceptable ;
结果:
【讨论】:
【参考方案2】:我通过将 PostJsonAsync 方法更改为解决了这个问题
var response = client.PostAsJsonAsync("login", loginUser).Result.Content.ReadAsStringAsync();
【讨论】:
以上是关于ASP.NET Core HttpClient 请求在 webapi 返回 406 时返回 200的主要内容,如果未能解决你的问题,请参考以下文章
在 ASP.NET Core 应用程序中使用多个 HttpClient 对象
如何在ASP.NET Core 中使用IHttpClientFactory
ASP.NET Core JWT 令牌无法通过 HttpClient 工作
使用 HttpClient 压缩对 asp.net core 2 站点的请求的最佳方法是啥?