ASP.NET Основной запрос HttpClient возвращает 200, когда webapi возвращает 406

#c# #.net-core #asp.net-core-mvc #dotnet-httpclient

Вопрос:

Я пытаюсь выполнить простой вход с помощью запроса httpclient post, но клиентская сторона возвращает только 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 amp;amp; 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
}
 

кто-нибудь знает, в чем может быть проблема?

Комментарии:

1. would anyone know what the problem would be? Вы не возвращаетесь с 406-го Login . Программное обеспечение не волшебное, оно не знает, что вы хотите это сделать. Вам нужно действительно это сделать.

2. Я также не уверен, что вы возвращаете 406-й. Я думаю, что вы возвращаете 300 со значением 406 в полезной нагрузке.

3. Оба вышеуказанных кода входа являются частью одного и того же проекта? тот же контроллер? Даже когда 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();