前言

  很久没更新博客了,加上刚过年,现在准备重新开战,继续自己的学习之路。本文已同步到Web API2系列文章中http://www.cnblogs.com/aehyok/p/3446289.html

  示例项目下载地址http://pan.baidu.com/s/1sjEWVPN  

  开放数据协议(OData)是Web数据访问协议。OData提供了一种统一的方式来组织数据,查询数据,并通过操纵CRUD操作的数据集(创建,读取,更新和删除)。

  OData同时支持AtomPub(XML)和JSON格式。OData的还定义了一个方法来公开元数据有关的数据。客户端可以使用元数据来发现类型信息和关系的数据集。ASP.NET Web API OData可以很容易的创建OData终结点的数据集。您可以控制​​哪些操作的OData终结点支持。你可以托管多个的OData终结点,沿着非OData终结点。你可以完全的控制你的数据模型,后台业务逻辑和数据层。

  在本教程中,您将创建一个简单的可供客户端可以查询的OData终结点。您还可以创建一个C#客户端的终结点。本教程使用的Visual Studio2013。

创建 Visual Studio 项目

在本教程中,您将创建支持基本的 CRUD 操作的OData 终结点。该终结点将公开一个单一的资源,一个产品的列表。以后的教程中将会添加更多的功能。

选择合适的模版进行创建项目

并命名为OData,点击确认后,在下一个Asp.Net 项目对话框中选择 Empty的空模版,并在以下对象添加文件夹和核心引用下:进行勾选Web  API。

添加一个实体模型

一个model就是在应用程序中展现数据的一个对象。在本教程中,我们需要一个展现产品的模型。这个模型对应着我们的OData的实体类型。

在解决方案资源管理器中,右键单击Models文件夹。从上下文菜单中,选择添加然后选择类。

添加相应的文件,并命名为Product。

在Product.cs文件中,添加如下类定义:

    public class Product
{
public int ID { get; set; }
public string Name { get; set; }
public decimal Price { get; set; }
public string Category { get; set; }
}

ID属性为实体键。客户端可以通过ID来查询产品。此字段也是后台数据库中表的主键,之后进行生成项目的步骤。

添加一个OData的控制器

控制器就是一个处理HTTP请求的类。在OData服务中你为每个实体数据集定义一个独立的控制器。在本教程中我们将创建一个单一的控制器。

在解决方案资源管理器中,右键单击控制器文件夹。选择添加,然后选择控制器.

在添加支架的对话框中,选择一个OData的模版,如下图所示。

在添加控制器对话框中,命名控制器名称为ProductsController。选择“使用异步控制器操作”。在模型类下拉菜单中选择Product。  

然后点击上面的“新建数据上下文”

  

并命名为ProductServiceContext。

然后将可以看到会在项目中添加两个文件:

添加EDM和Route

在解决方案资源管理器中,打开App_Start文件夹,然后找到WebApiConfig.cs文件并打开。用下面的代码进行替换之前默认的配置代码。

        public static void Register(HttpConfiguration config)
{
ODataConventionModelBuilder builder = new ODataConventionModelBuilder();
builder.EntitySet<Product>("Products");
config.Routes.MapODataRoute("odata", "odata", builder.GetEdmModel());
}

这个代码处理了两个问题:

1、为OData终结点创建一个数据实体模型(EDM)。

2、为OData终结点添加一个路由。

EDM是一个抽象的数据模型。EDM用于创建元数据文件和定义服务的URIs.ODataConventionModelBuilder 通过使用一组默认的EDM命名约定来创建 EDM。这种方法需要最少的代码。如果你想更多的来控制EDM,使用ODataModelBuilder类明确的添加属性、键、导航属性来创建EDM。

这个EntitySet 方法就是将一个实体添加到EDM实体中。

modelBuilder.EntitySet<Product>("Products");

字符串Products定义的是这个实体集的名称。控制器的名称必须匹配实体集的名称。在这个教程中,这个实体集的名称被命名为”Products“,这个控制器被命名为ProductsController。如果你命名这个实体集为”ProductSet“,那么你将需要把控制器命名为”ProductSetController“。请注意一个终结点可以包含多个实体集。为每个实体集调用EntitySet<T>,然后定义一个合适的控制器。

MapODataRoute 方法为OData终结点添加一个路由。

config.Routes.MapODataRoute("ODataRoute", "odata", model);

第一个参数是一个路由的名称。你的服务的客户端看不到这个名称的。第二个参数是终结点URL的前缀。鉴于这些代码,针对产品实体集的URL是http://hostname/odata/Products。你的应用程序可能会有超过一个的OData终结点。对于每一个终结点,调用MapODataRoute 方法,提供一个唯一的路由名称和一个唯一的URL前缀。

Seed the Database (可选的)

在这一步骤中,您将使用EF框架来插入数据库中一些测试数据。这一步是可选的,但是它能让你立刻测试出OData终结点。

从工具菜单中找到如下

并键入如下命名:

Enable-Migrations

这将添加一个Migrations 的文件夹,并有一个Configuration.cs的文件

打开Configuration.cs,在Seed方法中添加如下的代码:

        protected override void Seed(OData.Models.ProductServiceContext context)
{
context.Products.AddOrUpdate(new Product[] {
new Product() { ID = , Name = "Hat", Price = , Category = "Apparel" },
new Product() { ID = , Name = "Socks", Price = , Category = "Apparel" },
new Product() { ID = , Name = "Scarf", Price = , Category = "Apparel" },
new Product() { ID = , Name = "Yo-yo", Price = 4.95M, Category = "Toys" },
new Product() { ID = , Name = "Puzzle", Price = , Category = "Toys" },
});
}

然后再在软件包管理器控制台窗口,输入以下命令,并顺序执行两个命令:

Add-Migration Initial
Update-Database

测试OData终结点

在这一部分,我们将使用 Fiddler Web Debugging 来发送请求到终结点来检测响应消息。这将帮助您去理解OData终结点的功能。

在Visual Studio中,按F5进行运行程序。

1、然后在Fiddler中http://localhost:3629/Odata/Products,获得产品列表

点击执行

2、为了得到元数据文件,可以发送请求如下http://localhost:3629/odata/$metadata,直接通过浏览器

3、为了通过ID来获取某一个实体http://localhost:3629/Odata/Products(1)

4、可以发现默认得到的数据格式是JSON格式的,下面我们来设置一个xml格式的。

得到如下数据

5、再换一个数据格式application/json;odata=verbose.

得到数据如下

总结

这是执行程序调用上下文之后产生的数据库文件。直接生成在项目中,进行添加即可。

示例项目下载地址http://pan.baidu.com/s/1sjEWVPN

本文参考地址http://www.asp.net/web-api/overview/odata-support-in-aspnet-web-api/creating-an-odata-endpoint

Asp.Net Web API 2第十七课——Creating an OData Endpoint in ASP.NET Web API 2(OData终结点)的更多相关文章

  1. [转]Asp.Net Web API 2第十七课——Creating an OData Endpoint in ASP.NET Web API 2(OData终结点)

    本文转自:http://www.cnblogs.com/aehyok/p/3545824.html 前言 很久没更新博客了,加上刚过年,现在准备重新开战,继续自己的学习之路.本文已同步到Web API ...

  2. 如何在ASP.NET Web站点中统一页面布局[Creating a Consistent Layout in ASP.NET Web Pages(Razor) Sites]

    如何在ASP.NET Web站点中统一页面布局[Creating a Consistent Layout in ASP.NET Web Pages(Razor) Sites] 一.布局页面介绍[Abo ...

  3. Asp.Net Web API 2(入门)第一课

    Asp.Net Web API 2(入门)第一课   前言 Http不仅仅服务于Web Pages.它也是一个创建展示服务和数据的API的强大平台.Http是简单的.灵活的.无处不在的.你能想象到几乎 ...

  4. Asp.Net Web API 2第十三课——ASP.NET Web API中的JSON和XML序列化

    前言 阅读本文之前,您也可以到Asp.Net Web API 2 系列导航进行查看 http://www.cnblogs.com/aehyok/p/3446289.html 本文描述ASP.NET W ...

  5. Asp.Net Web API 2第五课——Web API路由

    Asp.Net Web API 导航   Asp.Net Web API第一课——入门 http://www.cnblogs.com/aehyok/p/3432158.html Asp.Net Web ...

  6. Asp.Net Web API 2第七课——Web API异常处理

    前言 阅读本文之前,您也可以到Asp.Net Web API 2 系列导航进行查看 http://www.cnblogs.com/aehyok/p/3446289.html 本文主要来讲解Asp.Ne ...

  7. 使用ASP.NET Web Api构建基于REST风格的服务实战系列教程【九】——API变了,客户端怎么办?

    系列导航地址http://www.cnblogs.com/fzrain/p/3490137.html 前言 一旦我们将API发布之后,消费者就会开始使用并和其他的一些数据混在一起.然而,当新的需求出现 ...

  8. 微软实战训练营(X)重点班第(1)课:SOA必备知识之ASP.NET Web Service开发实战

    微软实战训练营 上海交大(A)实验班.(X)重点班 内部课程资料 链接:http://pan.baidu.com/s/1jGsTjq2 password:0wmf <微软实战训练营(X)重点班第 ...

  9. Creating the Help Page in ASP.NET Web API

    Introduction In this article we will define the process of creating the help page in the ASP .NET We ...

随机推荐

  1. java, poi, excel

    工作需要用java操作Excel,现在网上搜索了一下,决定选取POI包来操作.pom内容如下: <dependency> <groupId>org.apache.poi< ...

  2. 8.Mybatis的延迟加载

    在Mybatis中的延迟加载只有resultMap可以实现,ResultMap 可以实现高级映射(association,collection可以实现一对1和一对多的映射),他们具有延迟加载的功能,r ...

  3. Scanner键盘录入(欢迎交流)

    一:练习 判断一个字符串是否是对称字符串,例如"abc"不是对称字符串,"aba"."abba"."aaa"." ...

  4. 第2章 C#中的泛型

    2.1 理解泛型2.1.1 为什么要有泛型 并不一定要使用字符T作为类型参数的名称,也可以使用其他的字符,但习惯上使用T. 2.1.2 类型参数约束什么是“向下的强制转换(downcast)”?因为O ...

  5. Reflector 已经out了,试试ILSpy[转]

    Reflector是.NET开发中必备的反编译工具.即使没有用在反编译领域,也常常用它来检查程序集的命名规范,命名空间是否合理,组织类型的方法是否需要改善.举例说明,它有一个可以查看程序集完整名称的功 ...

  6. iOS页面间传值的方式(Delegate/NSNotification/Block/NSUserDefault/单例)

    iOS页面间传值实现方法:1.通过设置属性,实现页面间传值:2.委托delegate方式:3.通知notification方式:4.block方式:5.UserDefault或者文件方式:6.单例模式 ...

  7. .net获取IP和MAC地址

    获取IP  解决request.UserHostAddress取不到真实IP private string GetClientIP()   {    string result = HttpConte ...

  8. jQuery实现无缝滚动条

    很多时候只看别人的代码时很难看懂.有很多原因,有时候可能是没有耐心,这时候看一下实现的原理就很快明白代码的内容,所以要加些注释,让自己让别人都能看明白:有的时候就是因为知识有限就是不懂,哪怕代码很简单 ...

  9. quick-cocos2d-x之testlua之VisibleRect.lua

    require "extern" --这个类找到了可视区域的9个点的坐标:左上.上的中点.右上.左的中点.左下.下的中点.右下.右的中点.一般用于使用相对坐标的场合,解决自适应屏幕 ...

  10. C++11 删除链表重复数值

    #include <memory> #include <iostream> #include <chrono> #include <thread> us ...