C# ASP.NET Web API 2在发送整型参数的非整数值后,在请求时获取null
我有一个关于Asp.net Web Api 2的项目。在测试一个端点时,我遇到了.net framework的一种有趣的行为 这是endpoint的简化版本:C# ASP.NET Web API 2在发送整型参数的非整数值后,在请求时获取null,c#,.net,rest,asp.net-web-api2,C#,.net,Rest,Asp.net Web Api2,我有一个关于Asp.net Web Api 2的项目。在测试一个端点时,我遇到了.net framework的一种有趣的行为 这是endpoint的简化版本: [Route("api/v1/bookings/documenttype/{clientId}/{companyCode}/{year}")] [HttpGet] [ResponseType(typeof(IEnumerable<UserVoucherType>))] pub
[Route("api/v1/bookings/documenttype/{clientId}/{companyCode}/{year}")]
[HttpGet]
[ResponseType(typeof(IEnumerable<UserVoucherType>))]
public IHttpActionResult GetUserDocumentTypes(int clientId, string companyCode,
int year, [FromUri] int? month = null)
{
//Do Some work
return Ok();
}
[路线(“api/v1/bookings/documenttype/{clientId}/{companyCode}/{year}”)]
[HttpGet]
[责任类型(类型(IEnumerable))]
public IHttpActionResult GetUserDocumentTypes(int-clientId、string-companyCode、,
整年,[FromUri]int?month=null)
{
//做些工作
返回Ok();
}
这里的问题是,当我发送一个非整数值作为'month'参数的值,而不是得到错误的请求或类似的东西时,我在运行时得到null,这导致了问题。例如,端点的一个使用者正在发送“[1,2,3]”,并获取全年的所有数据,而不是获取错误消息
例如,对于这个请求,我得到以下我在ss上指出的值:
http://localhost:64652/api/v1/bookings/documenttype/1/0001/2019?month=[1,2,3]
现在我的问题是,对于这样一个案例,我如何才能返回一个错误的请求
month参数是可选的,我无法理解在端点上,消费者是否故意发送此参数null,或者他们发送的参数值无效
有这样的设置吗?我想写一个定制的paramater活页夹,但这不是太过工程化了吗?我认为框架的行为应该是默认返回错误的请求,还是我遗漏了什么?您可以更改Route属性以包含数据类型约束
[Route("api/v1/bookings/documenttype/{clientId}/{companyCode}/{year:int{min:2000}/{month:int?}")]
我添加了两个约束条件—月份和年份的数据类型,以及年份的最小值
有关更多详细信息,请参阅。您可以为可选参数创建模型,并将“范围”属性应用于月份 (这是.NET5,所以我使用的是
[FromQuery]
,但这也适用于[FromUri]
)
如果您必须手动检查ModelState.IsValid
以捕获错误,这将取决于您的配置
另外,使用
net5.0
和[FromQuery]int?month=null
将返回以下错误:
{
"type": "https://tools.ietf.org/html/rfc7231#section-6.5.1",
"title": "One or more validation errors occurred.",
"status": 400,
"traceId": "00-65615fa2ff03a141b2cd80d7fc4f9dca-db45cf7466ae6f4f-00",
"errors": {
"month": [
"The value '[1,2,3]' is not valid."
]
}
}
您应该验证用户的输入,如果失败,您可以返回badrequest,请阅读这里关于如何返回bad request@jomsk1e我如何验证参数的内容,它将变为null,这也可能是正常行为,因为它是可选参数,在端点上我无法理解的问题是,有人真的发送了月份参数null或发送了错误的值并变为null。不幸的是,更改路径对我们来说不是一个选项。所有可选参数都必须是api中的查询参数。从用户的角度来看,此处不更改路径。用户仍将使用与api/v1/bookings/documenttype/1/0001/2019?month=11相同的路径。建议在服务器端的GetUserDocumentTypes()顶部的Route属性中进行更改。让我们在这里为查询参数添加数据类型和值的约束。感谢您的回答,我们使用的是4.6.1框架版本,暂时无法更新框架。但这看起来对我很有帮助,有相关文档吗?我添加了一个应该适用于.net framework的选项。我想你忘了添加帮助程序类或?
{
"type": "https://tools.ietf.org/html/rfc7231#section-6.5.1",
"title": "One or more validation errors occurred.",
"status": 400,
"traceId": "00-65615fa2ff03a141b2cd80d7fc4f9dca-db45cf7466ae6f4f-00",
"errors": {
"month": [
"The value '[1,2,3]' is not valid."
]
}
}