发送 BadRequest(ModelState) 时,Postman 中的 "Could not get any response" 而不是 XML 格式的 ModelState 错误
"Could not get any response" in Postman instead of the ModelState error in XML format when sending BadRequest(ModelState)
原谅我的无知,这是我第一次尝试 ASP.Net Core WebAPI。我正在使用 AspNetCore.MVC 1.1.4 以防相关。我正在使用 Postman 来测试我的 API.
我有一个简单的 HttpPost,它发回预期的 400 错误请求。对于此测试,我发送了格式错误的 XML,因此我的 hostMessage 无法正确反序列化。客户想要在 XML.
中发送和接收的所有消息
[HttpPost("Message")]
public IActionResult ReceiveMessage([FromBody] HostMessage hostMessage)
{
if (hostMessage == null)
{
return BadRequest();
}
return Ok();
}
这让我得到了一个很好的预期反应。
当我更改代码时,它会 return 错误。
[HttpPost("Message")]
public IActionResult ReceiveMessage([FromBody] HostMessage hostMessage)
{
if (hostMessage == null)
{
return BadRequest(ModelState);
}
return Ok();
}
我原本希望得到状态 400 错误请求,但在模型状态中发现异常(反序列化 object 时出错),但我得到的是 "Could not get any response"
模型状态错误:
实际 Post人响应:
所以问题是,为什么当我将 ModelState 添加到 Bad Request 时,它不再 return 是一个预期的带有错误的 Bad Request,而是只是说它无法得到任何响应。
预 Post 编辑?
好的,在写这个 post 时想通了。客户想要 XML 中的所有内容。我的配置服务是这样设置的。
public void ConfigureServices(IServiceCollection services)
{
services.AddMvc()
.AddMvcOptions(x => x.InputFormatters.Insert(0, new XmlDataContractSerializerInputFormatter()))
.AddMvcOptions(x => x.OutputFormatters.Insert(0, new XmlDataContractSerializerOutputFormatter()));
}
当我删除 OutputFormatter 时,我在 JSON 中得到了预期的输出。
所以我更新了我的问题标题,现在我想问我如何 return XML 中的预期 ModelState 错误。
要回答有关如何获取该错误消息的具体问题,您需要遍历 ModelStateDictionary
对象直至 Errors
异常集合并获取第一个异常消息,如中所示图片中的对象树。
如果这就是您所追求的,我建议您使用 ModelStateDictionary
的扩展方法来搜索您和 return 您想要的消息。假设这就是您想要从 ModelState 获得的所有信息,并且您可能需要多个消息(如果它们存在),我会尝试这样做:
public static List<string> FindErrors(this ModelStateDictionary modelState)
{
List<string> errors = new List<string>();
foreach (var value in modelState.Values)
{
foreach(var error in value.Errors)
{
if (!string.IsNullOrWhiteSpace(error.ErrorMessage))
errors.Add(error.ErrorMessage);
if (error.Exception != null)
errors.Add(error.Exception.ToString()); // The ToString method gets the message you were looking for in this example
}
}
return errors;
}
然后像这样使用:
return BadRequest(ModelState.FindErrors());
如果异常消息确实是您想要的,那么这应该可以满足您的需求。
原谅我的无知,这是我第一次尝试 ASP.Net Core WebAPI。我正在使用 AspNetCore.MVC 1.1.4 以防相关。我正在使用 Postman 来测试我的 API.
我有一个简单的 HttpPost,它发回预期的 400 错误请求。对于此测试,我发送了格式错误的 XML,因此我的 hostMessage 无法正确反序列化。客户想要在 XML.
中发送和接收的所有消息[HttpPost("Message")]
public IActionResult ReceiveMessage([FromBody] HostMessage hostMessage)
{
if (hostMessage == null)
{
return BadRequest();
}
return Ok();
}
这让我得到了一个很好的预期反应。
[HttpPost("Message")]
public IActionResult ReceiveMessage([FromBody] HostMessage hostMessage)
{
if (hostMessage == null)
{
return BadRequest(ModelState);
}
return Ok();
}
我原本希望得到状态 400 错误请求,但在模型状态中发现异常(反序列化 object 时出错),但我得到的是 "Could not get any response"
模型状态错误:
实际 Post人响应:
所以问题是,为什么当我将 ModelState 添加到 Bad Request 时,它不再 return 是一个预期的带有错误的 Bad Request,而是只是说它无法得到任何响应。
预 Post 编辑? 好的,在写这个 post 时想通了。客户想要 XML 中的所有内容。我的配置服务是这样设置的。
public void ConfigureServices(IServiceCollection services)
{
services.AddMvc()
.AddMvcOptions(x => x.InputFormatters.Insert(0, new XmlDataContractSerializerInputFormatter()))
.AddMvcOptions(x => x.OutputFormatters.Insert(0, new XmlDataContractSerializerOutputFormatter()));
}
当我删除 OutputFormatter 时,我在 JSON 中得到了预期的输出。
所以我更新了我的问题标题,现在我想问我如何 return XML 中的预期 ModelState 错误。
要回答有关如何获取该错误消息的具体问题,您需要遍历 ModelStateDictionary
对象直至 Errors
异常集合并获取第一个异常消息,如中所示图片中的对象树。
如果这就是您所追求的,我建议您使用 ModelStateDictionary
的扩展方法来搜索您和 return 您想要的消息。假设这就是您想要从 ModelState 获得的所有信息,并且您可能需要多个消息(如果它们存在),我会尝试这样做:
public static List<string> FindErrors(this ModelStateDictionary modelState)
{
List<string> errors = new List<string>();
foreach (var value in modelState.Values)
{
foreach(var error in value.Errors)
{
if (!string.IsNullOrWhiteSpace(error.ErrorMessage))
errors.Add(error.ErrorMessage);
if (error.Exception != null)
errors.Add(error.Exception.ToString()); // The ToString method gets the message you were looking for in this example
}
}
return errors;
}
然后像这样使用:
return BadRequest(ModelState.FindErrors());
如果异常消息确实是您想要的,那么这应该可以满足您的需求。