我的应用程序是ASP.NET Core 1.0 Web API。
[HttpGet("{someData:MinLength(5):MaxLength(5)}")]
[Produces("application/json")]
public async Task<IActionResult> GetSomeData(string someData)
{
return this.Ok(JsonConvert.SerializeObject("Data is: " + someData));
}
因此,当我使用length 6
传递参数时,控制器会返回Response Code 404
和Response body no content
,因为参数没有length 5
。
这些信息对我来说没用,是否有办法返回更有用的错误信息?
我知道我可以在每个控制器中硬编码错误信息:
[HttpGet("{someData}")]
[Produces("application/json")]
public async Task<IActionResult> GetSomeData(string someData)
{
if (someData.Length != 5)
{
return this.StatusCode(404, JsonConvert.SerializeObject("The data has to be 5 digits long."));
}
return this.Ok(JsonConvert.SerializeObject("Data is: " + someData));
}
问题是,我的应用程序中有很多控制器,我不想每次都验证参数。
控制器是否有办法自行返回更有用的Responsebody?或者我是否真的必须在每个控制器中添加验证方法并忘记[HttpGet]
参数及其错误返回?
非常感谢
答案 0 :(得分:1)
路由约束用于限制哪些请求的路径进入给定的操作/路由目标。它们并不意味着执行模型验证 - 以后通过单独的机制完成。如果请求不符合您的路线限制,则它根本不会匹配该路线。如果它不匹配任何路线,您将获得404.
正如您在自己的回答中所述,路线文档中涵盖了这一点:https://docs.microsoft.com/en-us/aspnet/core/fundamentals/routing#route-template-reference
答案 1 :(得分:0)
好吧,我找到了答案:
无法获得更好的错误消息。
警告
避免使用约束进行输入验证,因为这样做意味着 无效输入将导致404(未找到)而不是400 带有适当的错误消息。应该使用路径约束 消除类似路线之间的歧义,而不是验证a的输入 特别的路线。
找到here