我有一个带有ODataOptions
参数的WebAPI控制器。
我想确保用户无法一举下载整个数据库
所以我验证了options
对象:
public IHttpActionResult Get(ODataQueryOptions<ViewModel> options)
{
var oDataValidationSettings = new ODataValidationSettings
{
MaxTop = 100
}
try
{
options.Validate(oDataValidationSettings);
}
catch (ODataException ex)
{
return BadRequest("OData query validation failed: " + ex.Message);
}
//return results
}
这适用于像
这样的调用http://host/api/controller?$filter=...&$top=1000
这将返回预期的验证错误消息。
但是,通过简单地提出要求来避免这样做很容易:
http://host/api/controller?
没有$top
,没有。 这实际上会返回整个表格!
如果根本没有指定$top
参数,则不会触发验证器。
我可以在从oData选项构造查询时添加.Take(100)
,但它看起来很hacky。
有没有更好的方法来处理丢失的$top
?
答案 0 :(得分:1)
您可以尝试使用PageSize来限制返回的实体数量。 有关如何使用它,请参阅此示例。 https://github.com/OData/ODataSamples/tree/master/WebApi/v4/ODataPagingSample