Не удается получить сообщение об ошибке на 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);