网站做的不好使,深圳企业学校网站建设,品质好物推荐怎么上,重庆集团公司网站建设本文转自#xff1a;http://www.cnblogs.com/fzrain/p/3923727.html 前言 很久没更新了#xff0c;之前有很多事情#xff0c;所以拖了很久#xff0c;非常抱歉。好了#xff0c;废话不多说#xff0c;下面开始正题。本篇仍然使用上一季的的项目背景#xff08;系列地址…本文转自http://www.cnblogs.com/fzrain/p/3923727.html 前言 很久没更新了之前有很多事情所以拖了很久非常抱歉。好了废话不多说下面开始正题。本篇仍然使用上一季的的项目背景系列地址http://www.cnblogs.com/fzrain/p/3490137.html来演示OData服务,因此我们可以直接使用之前建好的数据访问层。但是不是说一定要看到之前的所有内容我们只是借用数据库访问层对于数据库的模型构建移步(使用Entity Framework Code First构建数据库模型)。 有了数据访问的基础我们可以开始构建OData服务了。 第一步创建空的Web Api项目 打开项目的解决方案新建web项目选择空的web api项目如上图所示记得选择.Net Framework 4.5。建好项目之后需要添加对“EntityFramework”和“Learning.Data”我们的数据访问层的引用。 第二步添加OData引用 在默认的情况下Web Api是无法支持OData的因此我们需要添加对“Microsoft.ASP.NET Web API 2.1 OData”的引用——打开NuGet如下图所示 第三步配置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.EntitySetCourse(Courses);builder.EntitySetEnrollment(Enrollments);builder.EntitySetSubject(Subjects);builder.EntitySetTutor(Tutors);return builder.GetEdmModel();}} 虽然我们只是使用OData服务但我并没有移除默认的配置因为这两种路由规则是可以共存的。 上面为我们的OData服务配置了路由规则以及实体数据模型EDM EDM主要是定义数据类型、导航属性和方法来适应OData的格式。有2种方式来定义EDM第一种是基于公约的方式我们将使用“ODataConventionModelBuilder”类另一种则是使用“ODataModelBuilder”。 在这里我们将使用“ODataConventionModelBuilder ”因为它会根据我们定义的导航属性来生成关联集合的链接。相比来说写的代码比较少。如果你想在关联集合间有更多的控制那么你可以使用“ODataModelBuilder”。 我们在builder对象中添加了4个不同的实体注意字符串参数“Courses”定义的实体集合名字必须与Controller的名字保持一致也就是说我们的controller的名字必须是“CoursesController”。 “MapODataRoute”是一个扩展方法当我们添加对OData引用时就可以使用了。它主要为OData服务来定义路由规则的第一个参数指定一个名字这个名字客户端是不会用到的第二个参数是指对应OData终结点的URI前缀在我们的案列中访问Courses资源的URI就应该是http://hostname/odata/Courses。你可以在同一个应用程序中拥有多个OData终结点只需要调用“MapODataRoute”方法指定不同的前缀就行了。 第四步添加第一个只读的OData控制器 现在我们创建一个Web Api控制器来处理OData URI类似“/odata/Courses”的HTTP请求。右击controller文件夹-新增-选择“空的API控制器”模板并命名“CoursesController”。 创建好之后首先将我们的基类改成“System.Web.Http.OData.EntitySetController”。这个泛型基类需要2个参数第一个指映射到这个controller对应的实体类型第二个参数是指这个实体主键的类型下面上代码 public class CoursesController : EntitySetControllerCourse, int{LearningContext ctx new LearningContext();[Queryable(PageSize 10)]public override IQueryableCourse Get(){return ctx.Courses.AsQueryable();}protected override Course GetEntityByKey(int key){return ctx.Courses.Find(key);}} “EntitySetController”类定义了很多抽象和可重写的方法来更新和查询实体因此你会发现你可以重写很多的方法例如Get(),GetEntityByKey(),CreateEntrty(),PatchEntity(),UpdateEntity(),etc… 正如我前面提到的我们将创建一个只读的控制器这就意味着我们只实现读取的操作解释一下上面代码的实现 1.重写Get()方法并附上[Queryable]特性这意味着我们允许客户端发送HTTP的Get到我们的终结点并在URI参数值支持filterorder bypagination的操作。Queryable特性是一个action过滤器主要转换和校验查询的URI及相应参数当客户端查询将花费很多时间或者大量数据时候这个特性将会有意想不到的作用举个例子设置PageSize属性这样一次性只会给客户端返回10条数据 2.重写GetEntityByKey(int key)方法将支持客户端发送HTTP访问单个资源,形式类似于“/odata/Courses(5)”。注这里的key代表对应实体的主键。 第五步测试Courses控制器 现在我们开始测试我们的controller对于所有的请求我们都将accept header指定为“application/json”因此我们将获得轻量JSON数据你也可以去指定accept header为“application/json;odataverbose”或者“application/atomxml”来查看结果。 我们演示一下场景 1.$filter:我们查询所有时长超过4小时的课程发送Get请求http://{hostname}/OData/Courses?$filterDuration gt 4 2.$orderby, $take我们需要根据课程名排序并获取前5条记录发送Get请求http://{hostname}/OData/Courses?$orderbyName$top5 3.$select我们仅需要获取Name和Duration字段的值发送Get请求http://{hostname}/OData/Courses?$selectName,Duration 4.$expand我们需要获取每个课程对应的主题和讲师并根据课程名倒序排列发送Get请求http://{hostname}/OData/Courses?$expandCourseTutor,CourseSubject$orderbyName desc 通过刚刚4个例子我们可以看到在我们的返回结果中包含了UserName和Password这两个字段但个信息是没必要给客户端的。 十分幸运的是我们只需要去配置一下EDM就可以在返回结果中不包含这两个字段了具体做法在WebApiConfig类中的GenerateEdmModel()方法里加入如下代码 private static IEdmModel GenerateEdmModel(){var builder new ODataConventionModelBuilder();builder.EntitySetCourse(Courses);builder.EntitySetEnrollment(Enrollments);builder.EntitySetSubject(Subjects);builder.EntitySetTutor(Tutors);var tutorsEntitySet builder.EntitySetTutor(Tutors);tutorsEntitySet.EntityType.Ignore(s s.UserName);tutorsEntitySet.EntityType.Ignore(s s.Password);return builder.GetEdmModel();} 源码地址https://github.com/fzrain/WebApi.eLearning 作者FZRAIN 出处http://fzrain.cnblogs.com/ 本文版权归作者和博客园共有欢迎转载但未经作者同意必须保留此段声明且在文章页面明显位置给出原文连接否则保留追究法律责任的权利。 转载于:https://www.cnblogs.com/freeliver54/p/6924535.html