Не удается извлечь ошибки BadRequest при вызове микросервиса веб-API .NET CORE 5 из ASP.NET Проект MVC

#asp.net-core-mvc #asp.net-core-webapi #asp.net-core-5.0 #modelstate

Вопрос:

Я пытаюсь извлечь ModelState ошибки проверки из микросервиса, построенного с помощью веб-API .NET Core 5, из ASP.NET Основной интерфейс MVC.

Допустим, у меня есть модель, которая выглядит так:

 public class Comment
{
    public string Title { get; set; }
    [Required]
    public string Remarks { get; set; }
}
 

Когда я вызываю конечную точку rest в микросервисе через Swagger, чтобы обновить Comment модель без каких-либо замечаний, я получаю тело ответа, подобное этому:

 {
  "title": "One or more validation errors occurred.",
  "status": 400,
  "errors": {
    "Remarks": [
      "The Remarks field is required."
    ]
  }
}
 

Классно! Это то, чего я ожидаю… Однако, когда я вызываю эту конечную точку через свой проект MVC, я, похоже, не могу получить фактические «ошибки».

Вот как я называю конечную точку rest:

 var client = _httpClientFactory.CreateClient("test");
HttpContent httpContent = new StringContent(JsonConvert.SerializeObject(comment), Encoding.UTF8, "application/json"); 
HttpResponseMessage response = await client.PutAsync($"api/comments", httpContent);
 

Объект ответа просто имеет statusCode BadRequest значение «о». Я хочу получить информацию об ошибках (раздел, в котором говорится «Поле Примечания обязательно».), но я не вижу ее в Content свойстве Headers или или что-то в этом роде.

Я новичок в микрослужбах и .NET Core — я делаю что-то не так? Нужно ли мне что-то добавить к этому startup.cs ? Кажется странным, что я могу получить BadRequest статус, но никаких подтверждающих деталей проблемы.

Заранее спасибо!

Ответ №1:

Убедитесь, что ваш контроллер веб-api не объявлен с [ApiController] помощью .

Проект Веб-Api:

 //[ApiController]
[Route("api/[controller]")]
public class CommentsController : ControllerBase
{
    [HttpPut]
    public IActionResult Put([FromBody] Comment model)
    {
        if(ModelState.IsValid)
        {
            //do your stuff...
            return Ok();
        }
        return BadRequest(ModelState);
    }
}
 

Проект Mvc:

 HttpResponseMessage response = await client.PutAsync($"api/comments", httpContent);
var result = response.Content.ReadAsStringAsync().Resu<
 

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

1. Спасибо! Это привело меня к поиску решения. Я добавлял: ответ. EnsureSuccessStatusCode() после того, как ответ вернулся (забыл упомянуть в исходном сообщении), который стирал сведения об ошибке. Я проверяю ответ. IsSuccessStatusCode перед определением возврата BadResult() или Ok (), и теперь он работает.