http://www.cnblogs.com/shanyou/archive/2013/06/11/3131583.html

当SOA的社会风气被,最关键的一个定义就是契约(contract)。在开口计算的世界被,有关通信的太要紧之概念也是契约。XML具有强有力对数据的描述能力,Atom格式和AtomPub都起以XML之上,在Google和微软的推动下,也早就变成标准。但是,Atom/AtomPub和ODBC/OLEDB这样的真正数据交互协议相互较,还享有根本达的贫:缺乏数据类型的切实可行描述,降低了彼此性能。缺乏对数码查询的控制能力,比如返回特定的数集合的间距,或者说分页能力等等。微软基于EDM模型释出了:OData,这里也堪看到Entity
Framework对于NHibernate这样的ORM的家伙不同之战略性设想。

在.NET中,早期是因此Remoting/Webservice来处理所有程序中的通信,从.NET
3.0发端利用WCF统一了通信模型,ASP.NET MVC4的出,形成十分的One
ASP.NET战略性,增加了WebAPI和SingalR作为通信服务:

json 1

放数据协议(OData)大凡一个查询及创新数据的Web协议。OData以了web技术使HTTP、Atom发布协议(AtomPub)和JSON等来供针对性两样应用程序,服务与仓储的消息看。除了提供部分中心的操作(像增删改查),也提供了一些高级的操作看似过滤数据及实体的领航。OData扩展了上述的商谈而非是替他们。他可为XML(ATOM)或者JSON取代而OData的重中之重在于她适合REST原则。在某种意义上,它起于’简单’的REST
HTTP
服务上,并且有鲜明的对象——简化和原则我们操作与询问数据的法门。如果你过去以为您的REST服务创建搜索、过滤、或者分页API的时刻觉得非常辛苦,那么OData将凡一个不易的精选。

手上众多接口,无论是基于SOAP、REST还是别的都以交换数据经常以不同的模式。这种办法就回一那个堆客户记录。你跟着可操纵添加分页支持。你愿意以结果捆绑在一个网格中,并对准数据排序。最后,决定想使查询的事物,通过以邮政编码来询问。

  首先是,没有创造泛型客户端的路线,而这些和API紧密联系,因为她不掌握参数的一一或者模式给运用的各个。因为不能够创泛型客户端,你必须为各一个君希望暴露的API创建客户端。简单的根基HTTP
API可以实现,但其依然很高昂。逐渐增加之多样性客户端和这些API通信加剧了这题材。

  这种模式之次只问题是其迫使开发人员进行非常困难的衡量。我当暴露小只查询?你必要在爆出每一个若能体悟内容以及丢掉暴露一些,从而削弱服务中间和谐。前者导致API
需要管理的界面的增,后者会招我们日常所说的“数据竖井”,也尽管是必不可缺数据以一定模式受到锁定,其他应用不克简单以,因为她从不因为相同种植要的不二法门暴露于这以。服务准备比单纯应用要获取重新久远有,因此而要坐同等栽方式设计API,使该会持久,所以如果你发觉而待加上服务借口的新本子可免太好惩治,比如创建新的客户端。在重重案例被,服务开发者和客户端开发者并无是跟一个人数,因而改服务接口简直就是是勿可能的事情。

  通过OData,我们应用两样之法子。取代创建客户端签名和参数,我们问了如下的问题:“如果您用数据集作为来自处理,并为极其累利用的操作定义模式,像查询、分页、排序、新建、删除和翻新,服务接口因该是啊则的?”
这也便导致OData的创始。OData解决了地方提到的要服务规划挑战。

咱俩来拘禁一下启用OData商量的WebAPI的例子:

http://localhost:8080/api/meetings

http://localhost:8080/api/meetings?$filter=(Leader eq ‘Mark Nichols’)

http://localhost:8080/api/meetings?$top=2

http://localhost:8080/api/meetings?$filter=MeetingDate eq
datetime’2013-01-17′

当档次受到启用OData查询,首先在项目在Web API的OData支持,通过Nuget
查找ASP.NET Web API OData

json 2

Microsoft.AspNet.WebApi.OData提供可同等雨后春笋的类扩展了Web API。

以档次遭到启用OData查询:

public static void Register(HttpConfiguration config) {     // …     config.EnableQuerySupport();     // … }

而是行使self-hosting方式,在HttpSelfHostConfiguration上启用EnableQuerySupport():

var config = new HttpSelfHostConfiguration(new Uri(“http://localhost:8080”));
config.EnableQuerySupport();

然后拿Controls上之Action的归结果更改为IQueryable,并起上签[Queryable()]:

        // GET api/Meeting
        [Queryable(AllowedQueryOptions = AllowedQueryOptions.All)]
        public IQueryable<Meeting> Get()
        {
            return _scheduledMeetings.AsQueryable();
        }
需要添加 using System.Web.Http.OData.Query; 我们下AllowedQueryOptions 看支持那些OData的类型:

   // Summary:
    //     OData query options to allow for querying.
    [Flags]
    public enum AllowedQueryOptions
    {
        // Summary:
        //     A value that corresponds to allowing no query options.
        None = 0,
        //
        // Summary:
        //     A value that corresponds to allowing the $filter query option.
        Filter = 1,
        //
        // Summary:
        //     A value that corresponds to allowing the $expand query option.
        Expand = 2,
        //
        // Summary:
        //     A value that corresponds to allowing the $select query option.
        Select = 4,
        //
        // Summary:
        //     A value that corresponds to allowing the $orderby query option.
        OrderBy = 8,
        //
        // Summary:
        //     A value that corresponds to allowing the $top query option.
        Top = 16,
        //
        // Summary:
        //     A value that corresponds to allowing the $skip query option.
        Skip = 32,
        //
        // Summary:
        //     A value that corresponds to allowing the $inlinecount query option.
        InlineCount = 64,
        //
        // Summary:
        //     A value that corresponds to the default query options supported by System.Web.Http.QueryableAttribute.
        Supported = 121,
        //
        // Summary:
        //     A value that corresponds to allowing the $format query option.
        Format = 128,
        //
        // Summary:
        //     A value that corresponds to allowing the $skiptoken query option.
        SkipToken = 256,
        //
        // Summary:
        //     A value that corresponds to allowing all query options.
        All = 511,
    }

上面有只Format,我们可以拓展格式化输出。使用下的代码对Format进行数据格式化:

using
System.Net.Http.Formatting;

public static class WebApiConfig
    {
        public static void Register(HttpConfiguration config)
        {
            config.Routes.MapHttpRoute(
                name: "DefaultApi",
                routeTemplate: "api/{controller}/{id}",
                defaults: new { id = RouteParameter.Optional }
            );

config.Formatters.JsonFormatter.AddQueryStringMapping(“$format”, “json”, “application/json”);
config.Formatters.XmlFormatter.AddQueryStringMapping(“$format”, “xml”, “application/xml”);

            config.EnableQuerySupport();
        }

此外要小心的一些凡OData查询是大大小小写敏感的。

自己以运用Fiddler去测试者服务

json 3

json 4

咱俩从不写任何一个特意的逻辑去支持这些功能,全部且是因为框架来提供的。是无是OData也您的探寻、过滤、或者分页API的当儿提供了一个死好之选择项。

然而,如果只要往组织外部公开只是查询的操作,可以应用查询求证添加一个保护层以保障我们的劳务。微软的次经理Hongmei
Ge介绍了几种在Queryable API中补充加验证的场景。

Hongmei指出的率先个情景是,使用AllowedQueryOptions属性,只允许包含$top和$skip的查询。如下所示:

[Queryable(AllowedQueryOptions = AllowedQueryOptions.Skip |
AllowedQueryOptions.Top)] public IQueryable Get(int projectId)

还好下MaxTop和MaxSkip属性将$top和$skip的极端酷价值限制在100以及200:

[Queryable(MaxTop = 100)] public IQueryable Get(int projectId)

[Queryable(MaxSkip = 200)] public IQueryable Get(int projectId)

运AllowedOrderByProperties,可以拿结果按Id属性排序,因为以任何性能排序可能会见特别缓慢:

[Queryable(AllowedOrderByProperties = “Id”)] public IQueryable Get(int
projectId)

假定同意客户json端在$filter内使用相当比较,应该下AllowedLogicalOperators对该展开认证:

[Queryable(AllowedLogicalOperators = AllowedLogicalOperators.Equal)]
public IQueryable Get(int projectId)

将AllowedArithmeticOperators设置为None,就可关闭$filter中之算术操作:

[Queryable(AllowedArithmeticOperators =
AllowedArithmeticOperators.None)] public IQueryable Get(int projectId)

君还足以采取AllowedFunctions属性来界定$filter中之函数使用:

[Queryable(AllowedFunctions = AllowedFunctions.StartsWith)] public
IQueryable Get(int projectId)

方的代码意味着只能于$filter中运用StartsWith函数。

Hongmei还以身作则了高档场景被的查询证实,如为$skip、$top、$orderby、$filter自定义默认验证逻辑,以及用ODataQueryOptions来验证查询。

系文章:

OData Developers Reference: http://www.odata.org/developers/

OData in ASP.NET:
http://www.asp.net/web-api/overview/odata-support-in-aspnet-web-api

Limiting OData Query Options:
http://www.asp.net/web-api/overview/odata-support-in-aspnet-web-api/supporting-odata-query-options

OData Security:
http://www.asp.net/web-api/overview/odata-support-in-aspnet-web-api/odata-security-guidance

Add an OData Feed to Your App Using Web
API:http://marknic.net/2013/03/02/add-an-odata-feed-to-your-app-using-web-api/

Working with OData Queries in ASP.NET Web
API:http://www.codeguru.com/csharp/.net/working-with-odata-queries-in-asp.net-web-api.htm 

在ASP.NET Web API OData中使用Queryable API进行说明:
http://www.infoq.com/cn/news/2013/02/queryable-api

一个创 OData 的新选择: Web
API:http://msdn.microsoft.com/zh-cn/magazine/dn201742.aspx 

Building OData Service using ASP.Net Web API Tutorial – Part
1

演示代码下载: http://files.cnblogs.com/shanyou/WebApiOData.zip

 

相关文章

网站地图xml地图