大家能够伊始创设OData服务了,2、向化解方案中参与Web Api的引用公海赌船网址

routes.Add(new ServiceRoute("api/contacts", new HttpServiceHostFactory(), typeof(ContactsApi)));

第二步:添加OData引用

在默许的意况下,Web
Api是不可能支撑OData的,由此大家要求加上对“Microsoft.ASP.NET Web API 二.1OData”的引用——展开NuGet如下图所示:

公海赌船网址 1

先是步:创立空的Web Api项目

公海赌船网址 2

开辟项目的消除方案,新建web项目,选取空的web
api项目(如上图所示),记得选拔.Net Framework
4.伍。建好项目事后供给丰硕对“EntityFramework”和“Learning.Data”(大家的数目访问层)的引用。

公海赌船网址 3

前言

很久没更新了,此前有大多职业,所以拖了很久,12分抱歉。好了,废话不多说,上面起头正题。本篇如故选用上一季的的品种背景(种类地址http://www.cnblogs.com/fzrain/p/3490137.html)来演示OData服务,由此大家得以平昔运用以前建好的数码访问层。不过不是说肯定要察看后面包车型客车兼具剧情,大家只是借用数据库访问层,对于数据库的模型创设移动(动用Entity
Framework Code
First构建数据库模型
)。

有了数量访问的根底,大家能够伊始营造OData服务了。

前言

很久没更新了,从前有不少事情,所以拖了很久,分外抱歉。好了,废话不多说,下边发轫正题。本篇照旧使用上1季的的系列背景(种类地址http://www.cnblogs.com/fzrain/p/3490137.html)来演示OData服务,因而大家能够直接使用在此之前建好的数目访问层。不过不是说一定要察看前面包车型客车有所内容,大家只是借用数据库访问层,对于数据库的模子创设移动(选取Entity
Framework Code
First创设数据库模型
)。

有了数码访问的根底,我们能够初叶营造OData服务了。

经过NuGet来增添Web api的次序集引用,右击项目性质,接纳“Manage NuGet
Packages”

率先步:制造空的Web Api项目

公海赌船网址 4

开荒项目标消除方案,新建web项目,接纳空的web
api项目(如上图所示),记得选拔.Net Framework
四.伍。建好项目然后须求丰富对“EntityFramework”和“Learning.Data”(大家的数码访问层)的引用。

第6步:增添第二个只读的OData调控器

现行反革命大家创造二个Web Api调整器来管理OData
UTucsonI类似“/odata/Courses”的HTTP请求。右击controller文件夹->新扩张->选择“空的API调控器”模板并取名“CoursesController”。

创设好以后,首先将大家的基类改成“System.Web.Http.OData.EntitySetController”。那几个泛型基类须求3个参数:第三个指映射到这几个controller对应的实业类型;第三个参数是指那几个实体主键的连串,上面上代码:

public class CoursesController : EntitySetController<Course, int>
    {
        LearningContext ctx = new LearningContext();

        [Queryable(PageSize = 10)]
        public override IQueryable<Course> Get()
        {
            return ctx.Courses.AsQueryable();
        }

        protected override Course GetEntityByKey(int key)
        {
            return ctx.Courses.Find(key);
        }
    }

“EntitySetController”类定义了不少虚幻和可重写的方式来更新和查询实体,由此你会意识你能够重写诸多的法子举个例子:Get(),GetEntityByKey(),CreateEntrty(),帕特chEntity(),UpdateEntity(),etc…

正如我前边提到的,咱们将开创二个只读的调节器,那就表示我们只兑现读取的操作,解释一下上边代码的兑现:

1.重写Get()方法并附着[Queryable]特点,那表示大家允许客户端发送HTTP的Get到大家的终结点并在U揽胜I参数值援救filter,order
by,pagination的操作。Queryable个性是二个action过滤器,主要转换和校验查询的U昂CoraI及相应参数,当客户端询问将消费多数时日或然多量数码时候这一个特点将会有意外的功效(比如:设置PageSize属性,那样贰遍性只会给客户端重回十条数据)

二.重写GetEntityByKey(int
key)方法将援助客户端发送HTTP访问单个财富,方式类似于“/odata/Courses(5)”。注:那里的key代表对应实体的主键。

按下F五 运行调节和测试项目,然后再浏览器前面参预/Test

第5步:加多第3个只读的OData调节器

于今咱们创设三个Web Api调整器来拍卖OData
U奥德赛I类似“/odata/Courses”的HTTP请求。右击controller文件夹->新添->采纳“空的API调整器”模板并取名“CoursesController”。

创办好之后,首先将大家的基类改成“System.Web.Http.OData.EntitySetController”。那个泛型基类需求1个参数:第叁个指映射到那几个controller对应的实体类型;第四个参数是指那个实体主键的品种,上边上代码:

公海赌船网址 5

public class CoursesController : EntitySetController<Course, int>
    {
        LearningContext ctx = new LearningContext();

        [Queryable(PageSize = 10)]
        public override IQueryable<Course> Get()
        {
            return ctx.Courses.AsQueryable();
        }

        protected override Course GetEntityByKey(int key)
        {
            return ctx.Courses.Find(key);
        }
    }

公海赌船网址 6

“EntitySetController”类定义了累累空洞和可重写的点子来更新和询问实体,由此你会发掘你可以重写大多的诀要比如:Get(),GetEntityByKey(),CreateEntrty(),PatchEntity(),UpdateEntity(),etc…

正如本身目前提到的,大家将成立3个只读的调节器,那就意味着大家只兑现读取的操作,解释一下上边代码的兑现:

一.重写Get()方法并附着[Queryable]特征,那表示大家允许客户端发送HTTP的Get到大家的终结点并在UBMWX三I参数值协理filter,order
by,pagination的操作。Queryable性格是3个action过滤器,重要调换和校验查询的URubiconI及相应参数,当客户端询问将消费繁多岁月照旧大批量数目时候那些特点将会有意料之外的法力(比方:设置PageSize属性,那样一遍性只会给客户端重回10条数据)

贰.重写GetEntityByKey(int
key)方法将匡助客户端发送HTTP访问单个能源,情势类似于“/odata/Courses(五)”。注:那里的key代表对应实体的主键。

第三步:配置OData路由

打开“App_Start”文件夹中系统帮我们创造的“WebApiConfig”类,在那边有一个Register方法并注册路由规则。大家需要配置的OData也是写在此地,代码如下:

public static class WebApiConfig
    {
        public static void Register(HttpConfiguration config)
        {
            // Web API 配置和服务

            // Web API 路由
            config.MapHttpAttributeRoutes();

            config.Routes.MapHttpRoute(
                name: "DefaultApi",
                routeTemplate: "api/{controller}/{id}",
                defaults: new { id = RouteParameter.Optional }
            );
            config.Routes.MapODataRoute("elearningOData", "OData", GenerateEdmModel());
        }
        private static IEdmModel GenerateEdmModel()
        {
            var builder = new ODataConventionModelBuilder();
            builder.EntitySet<Course>("Courses");
            builder.EntitySet<Enrollment>("Enrollments");
            builder.EntitySet<Subject>("Subjects");
            builder.EntitySet<Tutor>("Tutors");

            return builder.GetEdmModel();
        }
    }

固然我们只是利用OData服务,但本身并从未移除私下认可的布置因为那三种路由规则是能够共存的。

地点为大家的OData服务配置了路由规则以及实体数据模型(EDM)

EDM重纵然定义数据类型、导航属性和章程来适应OData的格式。有贰种办法来定义EDM,第3种是依靠公约的点子,我们将使用“ODataConventionModelBuilder”类,另一种则是采取“ODataModelBuilder”。

在此间我们将动用“ODataConventionModelBuilder
”因为它会依附大家定义的导航属性来生成关联集结的链接。相比较来讲写的代码比较少。假若您想在提到集结间有更加多的支配,那么你能够选择“ODataModelBuilder”。

我们在builder对象中增加了伍个不相同的实业,注意:字符串参数“Courses”定义的实体集结名字务必与Controller的名字保持1致,也正是说大家的controller的名字务必是“CoursesController”。

MapODataRoute”是2个恢弘方法,当大家抬高对OData引用时就能够使用了。它根本为OData服务来定义路由规则的:第一个参数钦命2个名字,那么些名字客户端是不会用到的;第贰个参数是指对应OData终结点的UXC90I前缀(在大家的案列中走访Courses能源的U福特ExplorerI就活该是:http://hostname/odata/Courses)。你能够在同1个应用程序中持有五个OData终结点,只须求调用“MapODataRoute”方法钦命差异的前缀就行了。

公海赌船网址 7

第五步:测试Courses控制器

今昔大家开头测试大家的controller,对于持有的伸手大家都将accept
header钦点为“application/json”,由此大家将获得轻量JSON数据,你也得以去钦定accept
header为“application/json;odata=verbose”或许“application/atom+xml”来查阅结果。

小编们演示一下场景:

一.$filter:大家询问全部时间长度超越4小时的课程:发送Get请求http://{hostname}/OData/Courses?$filter=Duration gt
4

贰.$orderby,
$take:大家必要基于课程名排序并获得前5条记下:发送Get请求http://{hostname}/OData/Courses?$orderby=Name&$top=5

三.$select:大家仅必要赚取Name和Duration字段的值:发送Get请求http://{hostname}/OData/Courses?$select=Name,Duration

四.$expand:大家需求获得每一个课程对应的大旨和助教并依附课程名倒序排列:发送Get请求http://{hostname}/OData/Courses?$expand=CourseTutor,CourseSubject&$orderby=Name desc

经过刚刚5个例子我们能够看看在大家的归来结果中蕴藏了UserName和Password这四个字段,但个音讯是没供给给客户端的。,

公海赌船网址 8

至极侥幸的是咱们只要求去铺排一下EDM就足以在回来结果中不带有这些字段了,具体做法在WebApiConfig类中的GenerateEdmModel()艺术里进入如下代码:

公海赌船网址 9

private static IEdmModel GenerateEdmModel()
        {
            var builder = new ODataConventionModelBuilder();
            builder.EntitySet<Course>("Courses");
            builder.EntitySet<Enrollment>("Enrollments");
            builder.EntitySet<Subject>("Subjects");
            builder.EntitySet<Tutor>("Tutors");
            var tutorsEntitySet = builder.EntitySet<Tutor>("Tutors");

            tutorsEntitySet.EntityType.Ignore(s => s.UserName);
            tutorsEntitySet.EntityType.Ignore(s => s.Password);

            return builder.GetEdmModel();
        }

公海赌船网址 10

源码地址:https://github.com/fzrain/WebApi.eLearning

 

作者:FZRAIN

出处:http://fzrain.cnblogs.com/

正文版权归小编和博客园共有,接待转发,但未经笔者同意必须保留此段申明,且在篇章页面鲜明地方给出原著连接,不然保留追究法律义务的权利。

第二步:添加OData引用

在暗中同意的状态下,Web
Api是心有余而力不足支撑OData的,因而大家必要增加对“Microsoft.ASP.NET Web API 二.1OData”的引用——张开NuGet如下图所示:

公海赌船网址 11

服务器驱动协商(Server-driven Negotiation)

第三步:配置OData路由

打开“App_Start”文件夹中系统帮大家创立的“WebApiConfig”类,在此间有三个Register方法并注册路由规则。大家要求配置的OData也是写在此处,代码如下:

公海赌船网址 12

public static class WebApiConfig
    {
        public static void Register(HttpConfiguration config)
        {
            // Web API 配置和服务

            // Web API 路由
            config.MapHttpAttributeRoutes();

            config.Routes.MapHttpRoute(
                name: "DefaultApi",
                routeTemplate: "api/{controller}/{id}",
                defaults: new { id = RouteParameter.Optional }
            );
            config.Routes.MapODataRoute("elearningOData", "OData", GenerateEdmModel());
        }
        private static IEdmModel GenerateEdmModel()
        {
            var builder = new ODataConventionModelBuilder();
            builder.EntitySet<Course>("Courses");
            builder.EntitySet<Enrollment>("Enrollments");
            builder.EntitySet<Subject>("Subjects");
            builder.EntitySet<Tutor>("Tutors");

            return builder.GetEdmModel();
        }
    }

公海赌船网址 13

就算如此大家只是利用OData服务,但自己并从未移除暗中同意的布置因为这三种路由规则是足以存活的。

上边为大家的OData服务配置了路由规则以及实体数据模型(EDM)

EDM首若是定义数据类型、导航属性和格局来适应OData的格式。有2种艺术来定义EDM,第三种是凭仗公约的形式,大家将接纳“ODataConventionModelBuilder”类,另壹种则是应用“ODataModelBuilder”。

在那里大家将运用“ODataConventionModelBuilder ”因为它会依赖大家定义的导航属性来生成关联合公司合的链接。相比较来讲写的代码比较少。借使你想在关系集结间有越多的主宰,那么您能够使用“ODataModelBuilder”。

我们在builder对象中增添了多少个不等的实业,注意:字符串参数“Courses”定义的实体集结名字务必与Controller的名字保持一致,也便是说大家的controller的名字务必是“CoursesController”。

MapODataRoute”是二个扩张方法,当大家增多对OData引用时就能够动用了。它最首要为OData服务来定义路由规则的:第陆个参数内定一个名字,那么些名字客户端是不会用到的;第二个参数是指对应OData终结点的U帕杰罗I前缀(在大家的案列中做客Courses财富的USportageI就应当是:http://hostname/odata/Courses)。你能够在同八个应用程序中存有三个OData终结点,只必要调用“MapODataRoute”方法钦命分裂的前缀就行了。

第五步:测试Courses控制器

未来大家开始测试大家的controller,对于全数的乞请大家都将accept
header钦定为“application/json”,因而大家将收获轻量JSON数据,你也足以去钦赐accept
header为“application/json;odata=verbose”或许“application/atom+xml”来查阅结果。

大家演示一下景色:

一.$filter:大家询问全数时间长度超越四小时的学科:发送Get请求http://{hostname}/OData/Courses?$filter=Duration
gt 4

二.$orderby,
$take:大家供给遵照课程名排序并拿走前伍条记下:发送Get请求http://{hostname}/OData/Courses?$orderby=Name&$top=5

三.$select:大家仅需求获得Name和Duration字段的值:发送Get请求http://{hostname}/OData/Courses?$select=Name,Duration

4.$expand:大家需求得到每一个课程对应的核心和教师并基于课程名倒序排列:发送Get请求http://{hostname}/OData/Courses?$expand=CourseTutor,CourseSubject&$orderby=Name
desc

由此刚刚4个例证大家能够看来在大家的回来结果中带有了UserName和Password这八个字段,但个消息是没要求给客户端的。,

公海赌船网址 14

可怜侥幸的是大家只须求去布署一下EDM就能够在回到结果中不分包那多少个字段了,具体做法在WebApiConfig类中的GenerateEdmModel()主意里投入如下代码:

private static IEdmModel GenerateEdmModel()
        {
            var builder = new ODataConventionModelBuilder();
            builder.EntitySet<Course>("Courses");
            builder.EntitySet<Enrollment>("Enrollments");
            builder.EntitySet<Subject>("Subjects");
            builder.EntitySet<Tutor>("Tutors");
            var tutorsEntitySet = builder.EntitySet<Tutor>("Tutors");

            tutorsEntitySet.EntityType.Ignore(s => s.UserName);
            tutorsEntitySet.EntityType.Ignore(s => s.Password);

            return builder.GetEdmModel();
        }

源码地址:https://github.com/fzrain/WebApi.eLearning

public static void RegisterRoutes(RouteCollection routes)
   {
    routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
    routes.Add(new ServiceRoute("api/contacts", new HttpServiceHostFactory(), typeof(ContactsApi)));    

routes.MapRoute(
        "Default", // Route name
        "{controller}/{action}/{id}", // URL with parameters
        new { controller = "Home", action = "Index", id = UrlParameter.Optional } // Parameter defaults
    );
}
MapServiceRoute需要一个泛型参数指定服务(API),以及一个将被追加到IIS base url的路径。在这里,我们指定的“contacts”,也就是宿主为“http://localhost:9000/api/contacts”。 

挑选安装,NuGet就会下载全部所需的软件包,以后得以起来开垦Web Api。

公海赌船网址 15

公海赌船网址 16

陆、通过浏览器查询Contracts.按F5周转品种,然后再浏览器地址栏中输入http://localhost:9000/api/contacts

 

展开Fiddler,在“Request
builder”栏输入地方“http://localhost:9000/api/contacts”,然后移动到“Request
Headers”在“User-Agent” 项下方增添 “Accept: application/json”

return contacts.AsQueryable();

在RegisterRoutes方法里进入下述代码

9、WCF Web API也提供了2个WCF Web Test Client用于测试WCF Web
API,通过安顿启用,在RegisterRoutes方法里创立HttpConfiguration
实例,并设置EnableTestClient属性为True:

using ContactManager.APIs;

using System.ServiceModel.Activation;
  • 怎么着选拔NuGet向品种中增多Web Api引用
  • 何以创建多个经过HTTP GET访问的Web Api
  • 什么样通过asp.net routes宿主3个Web Api
  • 如何通过浏览器依然Fiddler访问Web Api
  • 如何在Api上启用OData uri查询
  • 如何用WCF Web Test Client测试WCF Web API

在NuGet处理扩张器上查询Online的”webapi.all“

3、创制二个Contacts Api类

公海赌船网址 17

2、向化解方案中参与Web Api的引用

8、启用OData 查询帮助

右击项目ContactManager项目选取增多新的文本夹“Resources”,在Resources文件下成立一个新的类Contact。

1、创立三个骨干的缓慢解决方案:使用VS2010新建1个空的ASP.NET MVC 三 Web
Application

也可以透过Fidder去查询,具体可参照第七步。

总结

公海赌船网址 18

4、通过asp.net routing注册ContractsApi

Web API支持OData磋商,接受OData的U凯雷德I格式查询,当OData 查询达到Web Api,
在重返客户端在此以前在服务端会进展要求的过滤和排序。查询利用IQueryable
接口,服务端并从未去查询全部的多少,发送过滤和排序到服务端。

公海赌船网址 19

右击项目ContactManager选择增多3个文书夹,取名”APIs“,然后在APIs文件夹上右击增添类,类名字为做ContactsApi:

接下来把HttpConfiguration实例传递给HttpServiceHostFactory的布置属性

增进三个Get方法重临全体的contracts

ContractsApi 加了ServiceContractAttribute表示这是叁个WCF
服务,将经过HTTP格局暴露出来。

 

上边包车型客车艳情部分很重大,MVC的暗许路由是映射到controller + action

using System.ServiceModel;
namespace ContactManager.APIs
{
    [ServiceContract]
    public class ContactsApi
    {
    }
}
  1. 由此三个HTTP Get 方法揭穿contacts:首先创制一个poco(Plain Old
    C#)Contract类,代表大家在api上传递的牵连人,本质上便是贰个DTO(数据传输对象),在HTTP上我们把它当做能源,然后创造3个HTTP
    Get方法暴光能源。

运营程序,在浏览器里输入
http://localhost:9000/api/contacts?$Top=4&$OrderBy=Name
,看到浏览器之再次来到了按名字排序的top 5个contract

公海赌船网址 20

因而那么些Quick start,我们学习到了以下内容

Api须要经过asp.net mvc宿主,使用ASP.net
Route的MapServiceRoute扩张方法把它注册进去。切换成global.asax.cs文件,增加以下引述

routes.Add(new ServiceRoute(“api/contacts”, new HttpServiceHostFactory()
{ Configuration = config }, typeof(ContactsApi)));

2011-10-16日立异到WebAPI 0.伍 Preview

WCF Web
API援救多少个宿主情形:自宿主(windows服务只怕调整台)和IIS宿主(asp.net
webform/mvc)。这么些入门小说首要演示在ASP.NET MVC叁网址宿主:

namespace ContactManager.Resources
{
    public class Contact
    {
        public int ContactId { get; set; }
        public string Name { get; set; }
    }
}

var config = new HttpConfiguration() { EnableTestClient = true };

公海赌船网址 21 

  • 怎样行使NuGet向项目中增添Web Api引用
  • 哪些创设二个由此HTTP GET访问的Web Api
  • 怎么通过asp.net routes宿主1个Web Api
  • 什么通过浏览器依然Fiddler访问Web Api
  • 如何在Api上启用OData uri查询
  • 如何用WCF Web Test Client测试WCF Web API

您能够在这里获得到代码。

Web api再次回到的响应很轻巧增多壹种媒体类型(media types )。

重回到ContactApi类,加多下述引用:

Get方法上加了WebGet Attribute表示那是3个HTTP
Get。注意那里的UriTemplate被安装为“”,暗许情状下,操作的Uri是办法名Get,在那种情景下,我们是在Route中设置的Uri。

柒、查询重回Json格式的Contracts。HTTP提供了有的“内容协商”机制 —
当有多少个可得的表现格局的时候,对一定的响应选拔最棒的表现方式的管理进度。

using System.ServiceModel.Web;
using ContactManager.Resources;

假诺响应的最佳的表现格局的精选是透过服务器上的算法来兑现,那么那种措施的情商称做服务器驱动协商。选取是根据响应可得的表现形式(依据不相同的维度,响应会不一致;比方,语言,内容编码,等等)和呼吁信息里一定的头域或有关请求的别样消息(如:网络客户端的地方)。
服务器驱动协商是有帮助和益处的,当从实用的表现方式里进行精选的算法对用户代理实行描述是比较艰巨的时候,恐怕当服务器期望发送“最棒的猜忌”给客户端而只通过一个响应(避防止后续请求的回路(八个呼吁会回来3个响应)延迟假诺此“最佳的疑惑“对用户适合的时候)的时候。为了惜墨如金服务器的猜测,用户代理应该包蕴呼吁头域(Accept,Accept-Language,Accept-Encoding,等等),这个头域能描述它对响应的喜好。

按下
Exectue按键,双击左侧的Panel查看HTTP的response,切换来“Raw”Tab,你能够见见上面包车型地铁json格式的数量:

安装站点的端口号为捌仟

[WebGet(UriTemplate = "")]
public IQueryable<Contact> Get()
{
    var contacts = new List<Contact>()
        {
            new Contact {ContactId = 1, Name = "Phil Haack"},
            new Contact {ContactId = 2, Name = "HongMei Ge"},
            new Contact {ContactId = 3, Name = "Glenn Block"},
            new Contact {ContactId = 4, Name = "Howard Dierking"},
            new Contact {ContactId = 5, Name = "Jeff Handley"},
            new Contact {ContactId = 6, Name = "Yavor Georgiev"}
        };
    return contacts.AsQueryable();
}

相关文章