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 站点的请求的最佳方法是啥?

ASP.NET Core中如何针对一个使用HttpClient对象的类编写单元测试

在 Asp.Net Core 5.0 中注册 HttpClient 时注入 ILogger