如何禁用 c# ODataController 客户端查询

How to disable c# ODataController client side query

提问人:user3670419 提问时间:4/26/2016 更新时间:4/27/2016 访问量:1329

问:

根据本教程: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 选项的支持。这些选项允许客户端控制它从服务器返回的表示形式”

我的问题是,我怎样才能禁用在客户端完成的表示操作。换句话说,我的服务器确保过滤/选择等正确完成,因此我不希望客户端再次这样做。这更像是一种开销。

C# .NET ASP.NET-WEB-API ODATA 客户端

评论

0赞 Uriil 4/26/2016
如果您只是不将 [Queryable] 属性添加到方法怎么办?
0赞 user3670419 4/26/2016
不过,我在任何地方都没有[Queryable]属性
0赞 Uriil 4/26/2016
1) 你能提供你的控制器的例子吗?2)为什么需要OData控制器,如果你不想使用它的功能,就切换到常规的ApiController

答:

0赞 Vincent 4/27/2016 #1
  1. 在控制器操作(如 get 方法)中,添加属性 [EnableQuery](这适用于 OData v4)

  2. 在您的客户端中,发送类似 ~/EntitySet?$filter=...& $select = ...

然后,响应将仅包含筛选和选择的内容。 请参阅 https://github.com/OData/ODataSamples/tree/master/WebApi/v4/ODataQueryableSample 以查看示例。

1赞 lencharest 4/27/2016 #2

我想你误解了查询选项的目的,如 、 等。它们不会导致在客户端上操作数据。相反,它们是对服务的说明。在 Web API OData 实现中,查询选项通常由属性或属性处理。如果不使用这些属性,则负责编写处理查询选项的代码。或者你可以自由地不支持他们。$expand$selectEnableQueryQueryable

0赞 Ramin 4/27/2016 #3

可以创建继承自 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)
    {
    }