【问题标题】:ASP.NET Core HttpClient request returns 200 when webapi returns 406ASP.NET Core HttpClient 请求在 webapi 返回 406 时返回 200
【发布时间】:2026-01-08 05:30:01
【问题描述】:

我正在尝试使用 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,您需要更改响应的状态码。

标签: c# .net-core asp.net-core-mvc dotnet-httpclient


【解决方案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();
    

    【讨论】: