WebApi2官网学习记录---OData中的查询
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中的查询的更多相关文章
- WebApi2官网学习记录---Html Form Data
HTML Forms概述 <form action="api/values" method="post"> 默认的method是GET,如果使用GE ...
- WebApi2官网学习记录---Cookie
Cookie的几个参数: Domain.Path.Expires.Max-Age 如果Expires与Max-Age都存在,Max-Age优先级高,如果都没有设置cookie会在会话结束后删除cook ...
- WebApi2官网学习记录--HttpClient Message Handlers
在客户端,HttpClient使用message handle处理request.默认的handler是HttpClientHandler,用来发送请求和获取response从服务端.可以在clien ...
- WebApi2官网学习记录--HTTP Message Handlers
Message Handlers是一个接收HTTP Request返回HTTP Response的类,继承自HttpMessageHandler 通常,一些列的message handler被链接到一 ...
- WebApi2官网学习记录---Configuring
Configuration Settings WebAPI中的configuration settings定义在HttpConfiguration中.有一下成员: DependencyResolver ...
- WebApi2官网学习记录--- Authentication与Authorization
Authentication(认证) WebAPI中的认证既可以使用HttpModel也可以使用HTTP message handler,具体使用哪个可以参考一下依据: 一个HttpModel可以 ...
- WebApi2官网学习记录---Tracing
安装追踪用的包 Install-Package Microsoft.AspNet.WebApi.Tracing Update-Package Microsoft.AspNet.WebApi.WebHo ...
- WebApi2官网学习记录---异常处理
HttpResponseException 当WebAPI的控制器抛出一个未捕获的异常时,默认情况下,大多数异常被转为status code为500的http response即服务端错误. Http ...
- WebApi2官网学习记录---Content Negotiation
Content Negotiation的意思是:当有多种Content-Type可供选择时,选择最合适的一种进行序列化并返回给client. 主要依据请求中的Accept.Accept-Charset ...
随机推荐
- 《第一行代码》学习笔记34-服务Service(1)
1.服务是Android中实现程序后台运行的解决方案,适用于执行不需要和用户交互而且要长期运行的任务. 2.服务的运行不依赖于任何用户界面,或切到后台,或用户打开了另外一个应用程序,服务能够保持正常运 ...
- AngularJs练习Demo15自定义服务
@{ Layout = null; } <!DOCTYPE html> <html> <head> <meta name="viewport&quo ...
- Swift 循环、数组 字典的遍历
import Foundation // 数组声明 var arr = [String]() // 数组循环添加项 ...{ arr.append("Item \(index)") ...
- jQuery选择器全解
本篇介绍jQuery的选择器,jQuery选择器按照功能上分为"选择"和"过滤",并且是配合使用的.过滤的主要作用是从前面选定的选择器中选择的内容重进行筛选. ...
- cas+tomcat+shiro实现单点登录-3-CAS服务器深入配置(连接MYSQL)
目录 1.tomcat添加https安全协议 2.下载cas server端部署到tomcat上 3.CAS服务器深入配置(连接MYSQL) 4.Apache Shiro 集成Cas作为cas cli ...
- 《APUE》读书笔记第十三章-守护进程
守护进程 守护进程是生存期较长的一种进程,它们常常在系统自举时启动,仅在系统关闭时才终止.因为它们没有控制终端,所以说它们是在后台运行的.UNIX系统由很多守护进程,它们执行日常事务活动. 本章主要介 ...
- C#编码标准--编码习惯
C#编码标准--编码习惯 0. 书写程序时的大小写规则: a) 类:PascalCase表示法.如 MyClass b) 枚举值:PascalCase表示法.如 Colors.Red c) 枚举类型 ...
- 《HTML5经典坦克大战》游戏(代码)
前几天粗略地学了HTML5,然后就用它写了一个<经典坦克大战>游戏. 现在想分享一下我写的代码,写得不好请大家多多指教. 给大家推荐一个网站,这个网站是为大学生而做,为方便学习编程的同学而 ...
- 有n人围成一圈,顺序排号。从第1个人开始报数(从1到3报数),凡报到3的人退出圈子,问最后留下的是原来的第几号的那位。
#include <iostream> using namespace std; int main() { int i,j,n,m,k,*p,num[100];k=m=0; cin&g ...
- Python一路走来 DAY15 Javascript
JavaScript是一门编程语言,浏览器内置了JavaScript语言的解释器,所以在浏览器上按照JavaScript语言的规则编写相应代码之,浏览器可以解释并做出相应的处理. 一 如何编写 ...