【问题标题】:How to handle unknown parameters in ASP.NET Core Actions如何处理 ASP.NET Core 操作中的未知参数
【发布时间】:2021-02-17 01:54:09
【问题描述】:

如何处理 ASP.NET Core 中的未知参数?当我使用[FromQuery] 时,它只是忽略未知参数,但理想情况下,如果参数未知,它应该返回 400,以便调用者知道它需要修复参数?

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

但是如果像?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;
    }
}

【问题讨论】:

    标签: asp.net-core parameters controller


    【解决方案1】:

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

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

    要实现它,你可以使用ActionFilter,获取动作参数和请求查​​询字符串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;
    }
    

    【讨论】:

    【解决方案2】:

    你可以看例子https://docs.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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-10-30
      • 2011-09-21
      • 1970-01-01
      • 1970-01-01
      • 2021-12-18
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多