提问人:user3670419 提问时间:4/26/2016 更新时间:4/27/2016 访问量:1329
如何禁用 c# ODataController 客户端查询
How to disable c# ODataController client side query
问:
根据本教程:http://www.asp.net/web-api/overview/odata-support-in-aspnet-web-api/using-select-expand-and-value
“Web API 2 增加了对 OData 中的 $expand、$select 和 $value 选项的支持。这些选项允许客户端控制它从服务器返回的表示形式”
我的问题是,我怎样才能禁用在客户端完成的表示操作。换句话说,我的服务器确保过滤/选择等正确完成,因此我不希望客户端再次这样做。这更像是一种开销。
答:
在控制器操作(如 get 方法)中,添加属性 [EnableQuery](这适用于 OData v4)
在您的客户端中,发送类似 ~/EntitySet?$filter=...& $select = ...
然后,响应将仅包含筛选和选择的内容。 请参阅 https://github.com/OData/ODataSamples/tree/master/WebApi/v4/ODataQueryableSample 以查看示例。
我想你误解了查询选项的目的,如 、 等。它们不会导致在客户端上操作数据。相反,它们是对服务的说明。在 Web API OData 实现中,查询选项通常由属性或属性处理。如果不使用这些属性,则负责编写处理查询选项的代码。或者你可以自由地不支持他们。$expand
$select
EnableQuery
Queryable
可以创建继承自 EnableQueryAttribute 的自定义属性,然后重写 ValidateQuery 方法以限制允许的查询选项以及允许的函数和页面大小。
using System.Net.Http;
using System.Web.OData;
using System.Web.OData.Query;
public class SecureApiQueryAttribute : EnableQueryAttribute
{
public override void ValidateQuery(HttpRequestMessage request, ODataQueryOptions queryOptions)
{
base.AllowedQueryOptions = AllowedQueryOptions.None;
base.PageSize = 30;
base.AllowedFunctions = AllowedFunctions.AllFunctions;
base.ValidateQuery(request, queryOptions);
}
}
然后,您可以像这样使用此自定义属性
[SecureApiQuery]
public IHttpActionResult Get([FromODataUri] int? key = null)
{
}
评论