无法在Web Api 2中的BadRequest上收到错误消息

时间:2016-02-22 01:18:40

标签: c# error-handling asp.net-web-api2 response bad-request

我已经搜索了很多搜索我的问题的答案而没有运气,所以,如果其他人可以帮助我,请试试。

在进行一些验证后,我有一个Web Api 2操作来注册用户。如果一切正常,它将返回序列化用户,如果不是,则在BadRequest响应中发送错误消息。

另一方面,我有一个WPF客户端调用API进行响应。

我的问题是我无法得到错误发送的原因,客户端只是收到错误请求错误消息。

这是代码的一部分:

  • 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 nut,这里是你要求的序列化dto:

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

5 个答案:

答案 0 :(得分:6)

你检查了你的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>

不确定它是否会对你有帮助,但要试一试。

答案 1 :(得分:2)

不是返回它,而是抛出请求异常:

throw new HttpResponseException(HttpStatusCode.BadRequest);

除非您需要向客户提交更多详细信息,否则您可以传回Request.CreateErrorResponse,但您需要将返回类型更改为HttpResponseMessage

答案 2 :(得分:2)

API

return new BadRequestErrorMessageResult(yourErrorMessage);

客户端

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

答案 3 :(得分:1)

将以下行添加到Register方法中的WebAPIConfig.cs。这将包括错误详细信息,而不仅仅是通用的500内部服务器错误。

        GlobalConfiguration.Configuration.IncludeErrorDetailPolicy = IncludeErrorDetailPolicy.Always;

答案 4 :(得分:1)

最后,我放弃了。 也许某些代码在web.config,mvc config,api config,过滤或其他什么令人不安并发送不同于控制器的响应。 我向我的DTO添加了状态代码和消息属性,并始终返回一个对象。 无论如何,谢谢所有试图帮助我的人。