EMD安全

查询语法是基于entity data model(EDM),不是基于底层的model类型,可以从EDM排除一个属性,这样这个属性在client就不能被查询了。

有两种方式可以从EDM中排除一个属性

第一种使用 [IgnoreDataMember]特性

public class Employee
{
public string Name { get; set; }
public string Title { get; set; }
//当应用于类型的成员时,指定该成员不是数据协定的一部分且没有进行序列化 命名空间System.Runtime.Serialization
[IgnoreDataMember]
public decimal Salary { get; set; } // Not visible in the EDM
}

第二种方式以编程方式从EDM中排除属性

var employees = modelBuilder.EntitySet<Employee>("Employees");
employees.EntityType.Ignore(emp => emp.Salary);

安全查询

     [Queryable]特性是一个action过滤器支持解析、验证以及应用查询,过滤器将查询选项转为一个LINQ表达式。

Web API支持以下OData查询选项:

为了使用OData的查询,必须显示指定查询可用。可以在全局进行配置或在指定的控制器或action上。

public static void Register(HttpConfiguration config)
{
config.EnableQuerySupport();
// ...
}
public class ProductsController : ApiController
{
[Queryable]
IQueryable<Product> Get() {}
}

限制查询

为了安全或性能方面的考虑,可能需要限制一些操作。Queryable]特性有一些内建的属性可以实现这一点。如下所示:

//仅允许$skip与$top操作
[Queryable(AllowedQueryOptions=AllowedQueryOptions.Skip | AllowedQueryOptions.Top)]
//在指定属性上进行排序,对于在数据库中没有索引的字段会禁止排序操作的
[Queryable(AllowedOrderByProperties="Id")]
//仅允许“eq”这种逻辑操作
[Queryable(AllowedLogicalOperators=AllowedLogicalOperators.Equal)]
//禁止所有的算术操作
[Queryable(AllowedArithmeticOperators=AllowedArithmeticOperators.None)]

可以通过构造一个QueryableAttribute的实例在定义全局查询过滤

var queryAttribute = new QueryableAttribute()
{
AllowedQueryOptions = AllowedQueryOptions.Top | AllowedQueryOptions.Skip,
MaxTop =
}; config.EnableQuerySupport(queryAttribute);

直接调用查询选项

不使用[Queryable]特性,可以在controller中直接调用查询选项,这要做需要在方法中添加一个ODataQueryOptions参数

public IQueryable<Product> Get(ODataQueryOptions opts)
{
var settings = new ODataValidationSettings()
{
// Initialize settings as needed.
AllowedFunctions = AllowedFunctions.AllMathFunctions
}; opts.Validate(settings); IQueryable results = opts.ApplyTo(products.AsQueryable());
return results as IQueryable<Product>;
}

查询验证

[Querable]特性在执行之前就验证查询选项,验证步骤在QueryableAttribute.ValidateQuery 方法中执行,可以自定义验证过程。如下所示:

 public class MyOrderByValidator : OrderByQueryValidator
{
// Disallow the 'desc' parameter for $orderby option.
public override void Validate(OrderByQueryOption orderByOption,
ODataValidationSettings validationSettings)
{
if (orderByOption.OrderByNodes.Any(
node => node.Direction == OrderByDirection.Descending))
{
throw new ODataException("The 'desc' option is not supported.");
}
base.Validate(orderByOption, validationSettings);
}
} public class MyQueryableAttribute : QueryableAttribute
{
public override void ValidateQuery(HttpRequestMessage request,
ODataQueryOptions queryOptions)
{
if (queryOptions.OrderBy != null)
{
queryOptions.OrderBy.Validator = new MyOrderByValidator();
}
base.ValidateQuery(request, queryOptions);
}
} // Globally:
config.EnableQuerySupport(new MyQueryableAttribute()); // Per controller:
public class ValuesController : ApiController
{
[MyQueryable]
public IQueryable<Product> Get()
{
return products.AsQueryable();
}
}

如果直接使用ODataQueryOptions 可以设置验证器

public IQueryable<Product> Get(ODataQueryOptions opts)
{
if (opts.OrderBy != null)
{
opts.OrderBy.Validator = new MyOrderByValidator();
} var settings = new ODataValidationSettings()
{
// Initialize settings as needed.
AllowedFunctions = AllowedFunctions.AllMathFunctions
}; // Validate
opts.Validate(settings); IQueryable results = opts.ApplyTo(products.AsQueryable());
return results as IQueryable<Product>;
}

Note:在新版本的WebAPI中[Queryable]特性已经被否决,使用[EnableQuery]特性

WebApi2官网学习记录---OData中的查询的更多相关文章

  1. WebApi2官网学习记录---Html Form Data

    HTML Forms概述 <form action="api/values" method="post"> 默认的method是GET,如果使用GE ...

  2. WebApi2官网学习记录---Cookie

    Cookie的几个参数: Domain.Path.Expires.Max-Age 如果Expires与Max-Age都存在,Max-Age优先级高,如果都没有设置cookie会在会话结束后删除cook ...

  3. WebApi2官网学习记录--HttpClient Message Handlers

    在客户端,HttpClient使用message handle处理request.默认的handler是HttpClientHandler,用来发送请求和获取response从服务端.可以在clien ...

  4. WebApi2官网学习记录--HTTP Message Handlers

    Message Handlers是一个接收HTTP Request返回HTTP Response的类,继承自HttpMessageHandler 通常,一些列的message handler被链接到一 ...

  5. WebApi2官网学习记录---Configuring

    Configuration Settings WebAPI中的configuration settings定义在HttpConfiguration中.有一下成员: DependencyResolver ...

  6. WebApi2官网学习记录--- Authentication与Authorization

    Authentication(认证)   WebAPI中的认证既可以使用HttpModel也可以使用HTTP message handler,具体使用哪个可以参考一下依据: 一个HttpModel可以 ...

  7. WebApi2官网学习记录---Tracing

    安装追踪用的包 Install-Package Microsoft.AspNet.WebApi.Tracing Update-Package Microsoft.AspNet.WebApi.WebHo ...

  8. WebApi2官网学习记录---异常处理

    HttpResponseException 当WebAPI的控制器抛出一个未捕获的异常时,默认情况下,大多数异常被转为status code为500的http response即服务端错误. Http ...

  9. WebApi2官网学习记录---Content Negotiation

    Content Negotiation的意思是:当有多种Content-Type可供选择时,选择最合适的一种进行序列化并返回给client. 主要依据请求中的Accept.Accept-Charset ...

随机推荐

  1. scala学习笔记——操作符

    中置操作符(二元操作符),操作符位于两个参数之间.操作符包括字母,比如to,也可以包括操作符字符,比如1->10,等同于方法调用1.->(10) a 标识符 b 其中的标识符是一个带有两个 ...

  2. ORACLE之SQL语句内部解析过程【weber出品】

    一.客户端通过监听连接到数据库,数据库开启一个server process进程来接收客户端传过来的sql. 1.这条sql语句从来都没有被执行过.(硬解析) 2.这条sql语句被执行过.(软解析) 二 ...

  3. UIImageView中最容易用错的属性UIContentMode小记

    UIContentMode这东西初学真是各种问题,只能不断尝试,偶然发现网上这张图片,做下记录 还有个UIViewContentModeRedraw,在使用这个设置后,每当图片的bounds就是大小或 ...

  4. 自定义函数标签(JSTL)

    创建自定义函数标签步骤: 1.创建类,并且方法只能是静态 public static void operation(calculator cal) 2.书写tld <taglib xmlns=& ...

  5. Xml读取异常--Invalid byte 1 of 1-byte UTF-8 sequence

    xml读取异常Invalid byte 1 of 1-byte UTF-8 sequence org.dom4j.DocumentException: Invalid byte 1 of 1-byte ...

  6. Lintcode--002(两个字符串是变位词)

    写出一个函数 anagram(s, t) 判断两个字符串是否可以通过改变字母的顺序变成一样的字符串. 您在真实的面试中是否遇到过这个题?     样例 给出 s = "abcd", ...

  7. angularJs项目实战!03:angularjs与其他类库的协作

    引言:angularjs是一个中等重量级的前端开发框架 HTML是一门很好的为静态文本设计的语言,但要构建动态的web应用它就显的乏力了.通常,我们使用以下技术来解决静态网页技术在构建动态应用上的不足 ...

  8. cf C. Secrets

    http://codeforces.com/contest/334/problem/C #include <cstdio> #include <iostream> #inclu ...

  9. SVN莫名出错,网上找遍无果,递归删除当前目录下所有.svn文件名

    哎,太深刻的教训. 原来以前其它目录里有.SVN目录 ,而此SVN目录COPY到真正的SVN工作目录之后,会将有用的.SVN目录覆盖. 那么一样,显然,CI,UPDATE,CO之间的命令全部异常... ...

  10. BOT、BT、PPP形式介绍(3)

    PPP     20世纪90年代后,一种崭新的融资模式-PPP模式(Public-Private-Partnership,即“公共部门-私人企业-合作”的模式)在西方特别是欧洲流行起来,在公共基础设施 ...