#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();