Не удается получить сообщение об ошибке на BadRequest в Web Api 2

Я много гуглил в поисках ответа на мою проблему без везения, так что давайте попробуем, если кто-то еще может мне помочь.

у меня есть действие Web Api 2 для регистрации пользователя после выполнения некоторых проверок. Если все работает, он возвращает сериализованного пользователя, а если нет, сообщение об ошибке, отправленное в ответ BadRequest.

С другой стороны, у меня есть клиент WPF, который вызывает API для ответа.

моя проблема в том, что я не могу получить причину, отправленную ошибка, клиент просто получает сообщение об ошибке Bad Request.

это часть кода:

  • Действие Веб-Api:

    public async Task<IHttpActionResult> AddUser(NewUserDTO {
        if (!ModelState.IsValid)
        {
            return BadRequest(ModelState);
        }
        if (!model.IdCliente.HasValue)
        {
            ModelState.AddModelError("", "No existe el cliente");
            return BadRequest(ModelState);
        }
        // do save stuff
        return Ok(TheModelFactory.Create(user));
    }
    
  • функции клиента :

    public async Task<ApplicationUserDTO> AddUser(NewUserDTO dto) {
        using (var client = new HttpClient()) {
            client.BaseAddress = new Uri(_urlBase);
            client.DefaultRequestHeaders.Accept.Clear();
            client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
            client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", Token);
            HttpContent content = new StringContent(JsonConvert.SerializeObject(dto));
            content.Headers.ContentType = new MediaTypeHeaderValue("application/json");
            HttpResponseMessage responseMessage = await client.PostAsync("api/accounts/AddUser", content);
            if (responseMessage.IsSuccessStatusCode) {
                var responseJson = await responseMessage.Content.ReadAsStringAsync();
                user = JsonConvert.DeserializeObject<ApplicationUserDTO>(responseJson);
            }
            else
                 MessageBox.Show(responseMessage.Content.ReadAsStringAsync().Result);
            return user;
        } 
    }
    

кто может помочь?

редактировать:

  • DTO:

    [Serializable]
    public class NewUserDTO {
    public int? IdCliente { get; set; }
    [Required]
    public string UserName { get; set; }
    [Required]
    public string Email { get; set; }
    public string Role { get; set; }
    public string Password { get; set; } }
    

в любом случае... dto правильно отправляется в API nut, вот сериализованный dto, как вы просили для:

"{"IdCliente":null,"UserName":"Toni","Email":"soft@moreno-csa.com","Role":"Filtra","Password":"TONI"}"

5 ответов


вы проверили свою сеть.раздел config httpErrors?

у меня была такая же проблема, потому что мой веб.конфигурация выглядела так

<httpErrors errorMode="Custom" existingResponse="Replace">
    <clear />
    <error statusCode="404" path="~/Error/NotFound" responseMode="ExecuteURL" />
    <error statusCode="403" path="~/Error/AccessDenied" responseMode="ExecuteURL" />
    <error statusCode="500" path="~/Error/ServerError" responseMode="ExecuteURL" />
</httpErrors>

вы должны убедиться, что existingResponse установлено значение PassThrough

<httpErrors errorMode="Custom" existingResponse="PassThrough">
    <clear />
    <error statusCode="404" path="~/Error/NotFound" responseMode="ExecuteURL" />
    <error statusCode="403" path="~/Error/AccessDenied" responseMode="ExecuteURL" />
    <error statusCode="500" path="~/Error/ServerError" responseMode="ExecuteURL" />
</httpErrors>

не уверен, что это поможет вам, но дайте ему шанс.


вместо того, чтобы возвращать его, бросить исключение запрос:

throw new HttpResponseException(HttpStatusCode.BadRequest);

Если вы не требуете более подробной передачи клиента, в этом случае вы можете передать обратно Request.CreateErrorResponse но вам нужно будет изменить тип возврата на HttpResponseMessage


добавьте строку ниже в WebAPIConfig.cs в методе Register. Это будет включать сведения об ошибке, а не только общую ошибку внутреннего сервера 500.

        GlobalConfiguration.Configuration.IncludeErrorDetailPolicy = IncludeErrorDetailPolicy.Always;

наконец, я подаваемой вверх. Может быть, какой-то код в интернете.config, MVC config, API config, фильтрация или что-то еще беспокоит и отправляет другой ответ, чем контроллер. Я добавил код состояния и свойство сообщения в свой DTO и всегда возвращаю объект. Спасибо всем, кто пытался мне помочь.


API

return new BadRequestErrorMessageResult(yourErrorMessage);

клиент

var errorMessage = responseMessage.Content.ReadAsStringAsync().GetAwaiter().GetResult();
MessageBox.Show(errorMessage);