Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/wix/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# ASP.NET Web API 2在发送整型参数的非整数值后,在请求时获取null_C#_.net_Rest_Asp.net Web Api2 - Fatal编程技术网

C# ASP.NET Web API 2在发送整型参数的非整数值后,在请求时获取null

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

我有一个关于Asp.net Web Api 2的项目。在测试一个端点时,我遇到了.net framework的一种有趣的行为

这是endpoint的简化版本:

    [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."
        ]
    }
}