无法在 Web Api 2 中获取有关 BadRequest 的错误消息
Can't get error message on BadRequest in Web Api 2
我在谷歌上搜索了很多,但没有找到问题的答案,所以,让我们试试看是否有人可以帮助我。
我有一个 Web Api 2 操作来在进行一些验证后注册用户。如果一切正常,它 return 序列化用户,如果不正常,则在 BadRequest 响应中发送一条错误消息。
另一方面,我有一个 WPF 客户端调用 API 进行响应。
我的问题是我无法获取错误发送的原因,客户端只是收到 Bad Request 错误消息。
这是部分代码:
Web 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 坚果,这是您要求的序列化 dto:
"{\"IdCliente\":null,\"UserName\":\"Toni\",\"Email\":\"soft@moreno-csa.com\",\"Role\":\"Filtra\",\"Password\":\"TONI\"}"
抛出一个请求异常,而不是return:
throw new HttpResponseException(HttpStatusCode.BadRequest);
除非您需要传递给客户端的更多详细信息,在这种情况下您可以传回 Request.CreateErrorResponse
,但您需要将 return 类型更改为 HttpResponseMessage
将下面的行添加到 Register 方法中的 WebAPIConfig.cs。这将包括错误详细信息,而不仅仅是一般的 500 内部服务器错误。
GlobalConfiguration.Configuration.IncludeErrorDetailPolicy = IncludeErrorDetailPolicy.Always;
最后,我放弃了。
也许 web.config、mvc 配置、api 配置、过滤或任何令人不安的代码,并发送与控制器不同的响应。
我向我的 DTO 添加了一个状态代码和一条消息 属性,并且 return 始终是一个对象。
无论如何感谢所有试图帮助我的人。
您检查过 web.config httpErrors 部分了吗?
我遇到了同样的问题,因为我的 web.config 看起来像这样
<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>
不确定是否对您有帮助,但请试一试。
API
return new BadRequestErrorMessageResult(yourErrorMessage);
客户
var errorMessage = responseMessage.Content.ReadAsStringAsync().GetAwaiter().GetResult();
MessageBox.Show(errorMessage);
我在谷歌上搜索了很多,但没有找到问题的答案,所以,让我们试试看是否有人可以帮助我。
我有一个 Web Api 2 操作来在进行一些验证后注册用户。如果一切正常,它 return 序列化用户,如果不正常,则在 BadRequest 响应中发送一条错误消息。
另一方面,我有一个 WPF 客户端调用 API 进行响应。
我的问题是我无法获取错误发送的原因,客户端只是收到 Bad Request 错误消息。
这是部分代码:
Web 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 坚果,这是您要求的序列化 dto:
"{\"IdCliente\":null,\"UserName\":\"Toni\",\"Email\":\"soft@moreno-csa.com\",\"Role\":\"Filtra\",\"Password\":\"TONI\"}"
抛出一个请求异常,而不是return:
throw new HttpResponseException(HttpStatusCode.BadRequest);
除非您需要传递给客户端的更多详细信息,在这种情况下您可以传回 Request.CreateErrorResponse
,但您需要将 return 类型更改为 HttpResponseMessage
将下面的行添加到 Register 方法中的 WebAPIConfig.cs。这将包括错误详细信息,而不仅仅是一般的 500 内部服务器错误。
GlobalConfiguration.Configuration.IncludeErrorDetailPolicy = IncludeErrorDetailPolicy.Always;
最后,我放弃了。 也许 web.config、mvc 配置、api 配置、过滤或任何令人不安的代码,并发送与控制器不同的响应。 我向我的 DTO 添加了一个状态代码和一条消息 属性,并且 return 始终是一个对象。 无论如何感谢所有试图帮助我的人。
您检查过 web.config httpErrors 部分了吗?
我遇到了同样的问题,因为我的 web.config 看起来像这样
<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>
不确定是否对您有帮助,但请试一试。
API
return new BadRequestErrorMessageResult(yourErrorMessage);
客户
var errorMessage = responseMessage.Content.ReadAsStringAsync().GetAwaiter().GetResult();
MessageBox.Show(errorMessage);