如何处理 ASP.NET Core Actions 中的未知参数

问题描述 投票:0回答:2

如何处理ASP.NET Core中的未知参数?当我使用

[FromQuery]
时,它只是忽略未知参数,但理想情况下,如果参数未知,它应该返回 400,以便调用者知道需要修复参数?

示例:

GetRecords
尝试使用查询字符串中的任何
StartDate
EndDate
,如果未指定,则使用默认值。

但是,如果像

?StartTime=2021/2/15&EndTime=2021/2/16
这样的查询,代码实际上会返回数据库中的所有记录,因为它就像没有传递参数一样。理想情况下,它应该抛出一个错误,让调用者知道参数名称无效。

class RecordQuery 
{
    public RecordQuery()
    {
       StartDate = DateTime.MinValue;
       EndDateTime = DateTime.Now;
    }

    //...
}

class Controller
{
    public async Task<ActionResult<RecordsResult>> GetRecords([FromQuery] RecordQuery query)
    {
        // query db where date < query.EndDateTime && date > query.StartDateTime;
    }
}
c# asp.net-core parameters controller
2个回答
1
投票

当我使用 [FromQuery] 时,它只是忽略未知参数

实际上,这是查询字符串参数的默认行为。但是您可以返回无效请求状态,以便客户端知道它尝试执行的操作无效。

实现时可以使用ActionFilter,同时获取action参数和请求查询字符串queryParameters并进行判断。代码如下:

public class QueryActionFilter<T> : IActionFilter
{
    public void OnActionExecuted(ActionExecutedContext context)
    {
    }

    public void OnActionExecuting(ActionExecutingContext context)
    {
        var model = context.ActionArguments.Values.OfType<T>().Single();
        var modelProperties = model.GetType().GetProperties();

        var queryParameters = context.HttpContext.Request.Query;

        if (!queryParameters.Select(q => q.Key).All(queryParameter => modelProperties.Any(p => p.Name == queryParameter)))
        {
            context.Result = new BadRequestObjectResult("Querystring does not match");
        }
        

    }
}

然后在控制器中

[TypeFilter(typeof(QueryActionFilter<RecordQuery>))]
public async Task<ActionResult<RecordsResult>> GetRecords([FromQuery] RecordQuery query)
{
    // query db where date < query.EndDateTime && date > query.StartDateTime;
}

0
投票

您可以查看示例https://learn.microsoft.com/en-us/aspnet/core/tutorials/first-web-api?view=aspnetcore-5.0&tabs=visual-studio#the-puttodoitem-method

if(StartDate == null){
    return BadRequest();
}

让我们用另一个输入参数(查询条件)做同样的事情

如果您想验证输入参数,请使用

[Required]
作为
[FromQuery]
的模型,请参阅 https://stackoverflow.com/a/19279419/3728901 。在你的例子中,它是模型
RecordQuery
.

© www.soinside.com 2019 - 2024. All rights reserved.