【发布时间】:2020-09-23 03:17:21
【问题描述】:
我正在将一个 API 从 ASP .NET 4.7 移植到 .NET CORE 3.1,到目前为止,我已经设法完成了大部分工作,但我遇到了一个特定的错误。 我有以下端点
[HttpGet]
[Route("contacts/{id}/")]
public IActionResult GetContactByID(Guid? id)
{
if (!id.HasValue)
return BadParameter("id");
//Some irrelevant logic here
Contact foundContact = GetContactFromRepository(id);
return Ok(foundContact);
}
通过在旧 API 中提供无效的 Guid(“contacts/6cb735b1-b2f0-45d1-a5b5-3a161a5b8c5eTESTINVALIDGUID”) - 将到达端点并且检查 ID 是否具有值的 IF 语句将提供预期的错误响应格式。目前在 CORE 3.1 中,当在相同的请求中,我在 Postman 中得到以下响应:
"errors": {
"id": [
"The value '6cb735b1-b2f0-45d1-a5b5-3a1615555555asd' is not valid."
]
},
"type": "https://tools.ietf.org/html/rfc7231#section-6.5.1",
"title": "One or more validation errors occurred.",
"status": 400,
"traceId": "|90331587-428887e84126845c."
执行永远不会到达方法。但是控制器的构造函数被调用了。
我已经覆盖了大部分错误消息,并且我同时移植了多个 API 版本(每个版本都有不同的响应)。但我无法弄清楚这个错误来自哪里(以及如何处理它,以便请求真正到达控制器方法 - 以便我可以返回正确的响应)。
【问题讨论】:
-
.Net Core 似乎无法将字符串解析为 Guid 对象,因为它是无效的,并且框架只是向您返回了 BadRequest 响应。您的代码
if(...)的功能现在由 .Net Core Framework 完成。除非您输入有效的 Guid,否则该方法将永远不会被调用。 -
^^ 换句话说:“这不是一个错误。这是一个功能!”但我明白,你宁愿有自己的错误响应。所以问题将是“如何进入验证过程,以便解析失败的 Guid 传递给 'ok' 和
null而不是返回 400”,对吗? -
是的,您的建议似乎准确地总结了我的需要。
标签: c# rest asp.net-core asp.net-web-api