-
C#教程之c# AJAX实践VS2005 + RSSToolKit 开发你自己的
Rss 是一种描述和同步网站内容的格式,是目前使用最广泛的XML应用。RSS 搭建了信息迅速传播的一个技术平台,使得每个人都成为潜在的信息提供者。发布一个 Rss 文件后,这个 Rss Feed中包含的信息就能直接被其他站点调用,而且由于这些数据都是标准的XML格式,所以也能在其他的终端和服务中使用。
在之前我们如果要实现博客的RSS订阅,通常都需要手写代码去生产或读取XML。现在有了RSSToolKit,这一切就变得简单了。你可以使用他在五分钟内实现自己的 Rss 在线阅读器。这篇文章将介绍如何读取站点 Rss 信息。
开发环境:VS2005 + RSSToolKit
一、首先我们需要建立一个ASP.NET AJAX站点
二、引入RssToolKit到项目中,建好的项目如下(CSS和图片文件可以使用我压缩文档里的)
三、可以开始写代码了
1.首先需要一个ScriptManager、一个UpdatePanel、一个UpdateProgress。哈哈,都是废话AJAX页面程序大概都需要这些。其他的就是你的要求了。具体的页面代码如下:
1 <%@ Page Language="C#" AutoEventWireup="true" CodeFile="Default.aspx.cs" Inherits="_Default" %>
2
3 <%@ Register Assembly="RssToolkit" Namespace="RssToolkit" TagPrefix="Rss" %>
4 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
5 <html xmlns="http://www.w3.org/1999/xhtml">
6 <head runat="server">
7 <title>向东博客阅读器|meil.livebaby.cn</title>
8 <link href="CSS/Layout.css" rel="stylesheet" type="text/css" />
9
10 <script language="JavaScript" type="text/javascript">
11 var ls;
12 function ls_onClk(itemNumber) {
13
14 if(ls == null) ls = $get("List0");
15
16 ls.className = "";
17 ls = $get("list" + itemNumber);
18 ls.className = "current";
19 return true;
20 }
21 </script>
22
23 </head>
24 <body>
25 <form id="form1" runat="server">
26 <asp:ScriptManager ID="ScriptManager1" runat="server" />
27 <div id="content-header">
28 <h1><asp:HyperLink ID="HyperLink1" runat="server" Text="向东" Target="_blank" NavigateUrl="http://meil.livebaby.cn/index.html"></asp:HyperLink>
29 博客阅读器</h1>
30 </div>
31 <div id="content-container">
32 <div id="content-side1">
33 <ul class="list-of-links">
34 <li id="list0" class="current">
35 <asp:LinkButton ID="lb0" runat="server" CommandArgument="0" OnClientClick="ls_onClk(0);" OnCommand="lnk_cmd">向东博客</asp:LinkButton></li>
36 <li id="list1">
37 <asp:LinkButton ID="lb1" runat="server" CommandArgument="1" OnClientClick="ls_onClk(1);" OnCommand="lnk_cmd">财经博客</asp:LinkButton></li>
38 <li id="list2">
39 <asp:LinkButton ID="lb2" runat="server" CommandArgument="2" OnClientClick="ls_onClk(2);" OnCommand="lnk_cmd">Flower博客</asp:LinkButton></li>
40 <li id="list3">
41 <asp:LinkButton ID="lb3" runat="server" CommandArgument="3" OnClientClick="ls_onClk(3);" OnCommand="lnk_cmd">活力宝贝博客网</asp:LinkButton></li>
42 <li id="list4">
43 <asp:LinkButton ID="lb4" runat="server" CommandArgument="4" OnClientClick="ls_onClk(4);" OnCommand="lnk_cmd">悠悠宝贝的博客</asp:LinkButton></li>
44 <li id="list5">
45 <asp:LinkButton ID="lb5" runat="server" CommandArgument="5" OnClientClick="ls_onClk(5);" OnCommand="lnk_cmd"><font color="red">向东博客园博客</font></asp:LinkButton></li>
46 <li id="li6">
47 <asp:LinkButton ID="lb6" runat="server" CommandArgument="6" OnClientClick="ls_onClk(6);" OnCommand="lnk_cmd"><font color="red">博客园</font></asp:LinkButton></li>
48 </ul>
49 </div>
50 <div id="content-main">
51 <asp:UpdatePanel ID="updateMain" runat="server" UpdateMode="conditional" >
52 <Triggers>
53 <asp:AsyncPostBackTrigger ControlID="lb0" />
54 <asp:AsyncPostBackTrigger ControlID="lb1" />
55 <asp:AsyncPostBackTrigger ControlID="lb2" />
56 <asp:AsyncPostBackTrigger ControlID="lb3" />
57 <asp:AsyncPostBackTrigger ControlID="lb4" />
58 <asp:AsyncPostBackTrigger ControlID="lb5" />
59 <asp:AsyncPostBackTrigger ControlID="lb6" />
60 </Triggers>
61 <ContentTemplate>
62 <h2><asp:Label ID="lblHeader" runat="server">最新日志</asp:Label></h2>
63 <hr />
64 <asp:Panel ID="pnlBlog" runat="server">
65 <Rss:RssDataSource ID="rssDS" runat="server" MaxItems="0" Url=""></Rss:RssDataSource>
66 <asp:DataList ID="lsBlog" runat="server" DataSourceID="rssDS">
67 <ItemTemplate>
68 <asp:Panel ID="panelHeader" runat="server" Style="cursor: pointer; color: #d61719;width: 100%; display: block;">
69 <span style="float: left;"><%# Eval("title") %></span>
70 <asp:Image ID="Image1" runat="server" Style="float: right;" ImageUrl="~/images/expand_blue.jpg" />
71 </asp:Panel>
72 <asp:Panel ID="Panel1" runat="server" Style="margin-top: 3px;width: 100%; background: transparent url(images/blogBack.gif) no-repeat text-top left;">
73 <%# Eval("description") %>
74 (<asp:HyperLink ID="hlMore" runat="server" NavigateUrl='<%# Eval("link") %>' Target="_blank" Text="更多内容"></asp:HyperLink>)
75 </asp:Panel>
76 <ajaxT:CollapsiblePanelExtender ID="cpe1" runat="server" TargetControlID="Panel1"
77 ExpandControlID="panelHeader" CollapseControlID="panelHeader" SuppressPostBack="true"
78 ImageControlID="Image1" Collapsed="true" ExpandedImage="~/images/collapse_blue.jpg"
79 CollapsedImage="~/images/expand_blue.jpg" />
80 <hr style="border-bottom: 1px dotted #B2B2B2; margin: 0px;" />
81 </ItemTemplate>
82 </asp:DataList>
83 </asp:Panel>
84 </ContentTemplate>
85 </asp:UpdatePanel>
86 </div>
87 </div>
88 <asp:UpdateProgress ID="UpdateProgress1" runat="server" DisplayAfter="0" DynamicLayout="true">
89 <ProgressTemplate>
90 <div id="updProgress">
91 <img alt="" src="images/indicator.gif" />
92 <span>数据获取中</span>
93 </div>
94 </ProgressTemplate>
95 </asp:UpdateProgress>
96 </form>
97 <center><div><a href="http://meil.livebaby.cn">meil.livebaby.cn</a> 程序制作:向东 2007.7</center>
98 </body>
99 </html>
100
比较重要的是这两部分:
行66:<Rss:RssDataSource ID="rssDS" runat="server" MaxItems="0" Url=""></Rss:RssDataSource>
这就是实现RSS读取的核心了,有了这个标记就实现了RSS读取的一半工作,那剩下的吶?
看看下面者部分,lnk_cmd 命令实现了RSS数据的重绑定,这样你就可以实时的访问多个RSS地址了。如果你觉得这样还不够灵活,可以加个Textbox,然后用程序去绑定,这样也不错。不过,此次就不实现这个了,有兴趣的朋友可以试试,应该不难。哈哈!
行35:<asp:LinkButton ID="lb0" runat="server" CommandArgument="0" OnClientClick="ls_onClk(0);"
OnCommand="lnk_cmd">向东博客</asp:LinkButton></li>
1 protected void lnk_cmd(object sender, CommandEventArgs e)
2 {
3 int command = Convert.ToInt32(e.CommandArgument);
4
5 rssDataBind(command);
6 }
rssDataBind就是绑定的函数,代码是:
1 protected void rssDataBind(int cmd)
2 {
3 switch (cmd)
4 {
5 case 0:
6 rssDS.Url = "http://www.livebaby.cn/blog/u/meil/rss2.xml";
7 lsBlog.DataBind();
8 lblHeader.Text = "向东博客";
9 break;
10 case 1:
11 rssDS.Url = "http://www.livebaby.cn/blog/u/money/rss2.xml";
12 lsBlog.DataBind();
13 lblHeader.Text = "财经博客";
14 break;
15 case 2:
16 rssDS.Url = "http://www.livebaby.cn/blog/u/flower/rss2.xml";
17 lsBlog.DataBind();
18 lblHeader.Text = "Flower博客";
19 break;
20 case 3:
21 rssDS.Url = "http://www.livebaby.cn/blog/rss2.asp";
22 lsBlog.DataBind();
23 lblHeader.Text = "活力宝贝博客网";
24 break;
25 case 4:
26 rssDS.Url = "http://www.livebaby.cn/blog/u/yoyo/rss2.xml";
27 lsBlog.DataBind();
28 lblHeader.Text = "悠悠宝贝的博客";
29 break;
30 case 5:
31 rssDS.Url = "http://www.cnblogs.com/meil/rss";
32 lsBlog.DataBind();
33 lblHeader.Text = "向东博客园博客";
34 break;
35 case 6:
36 rssDS.Url = "http://www.cnblogs.com/rss";
37 lsBlog.DataBind();
38 lblHeader.Text = "博客园";
39 break;
40 default:
41 break;
42 }
43 }
就这么简单
rssDS.Url = "http://www.livebaby.cn/blog/u/meil/rss2.xml";
lsBlog.DataBind();
是不是就如DB数据的绑定。MS的东西虽然结构性不好,但是上手真的好快。
到底需要多少个Case就看你的需要了。我这里就绑定了六个RSS地址,你还可以更多,但要注意的是一定要和页面上的LinkButton数对应上。
最终的C#代码如下:
1 protected void rssDataBind(int cmd)
2 {
3 switch (cmd)
4 {
5 case 0:
6 rssDS.Url = "http://www.livebaby.cn/blog/u/meil/rss2.xml";
7 lsBlog.DataBind();
8 lblHeader.Text = "向东博客";
9 break;
10 case 1:
11 rssDS.Url = "http://www.livebaby.cn/blog/u/money/rss2.xml";
12 lsBlog.DataBind();
13 lblHeader.Text = "财经博客";
14 break;
15 case 2:
16 rssDS.Url = "http://www.livebaby.cn/blog/u/flower/rss2.xml";
17 lsBlog.DataBind();
18 lblHeader.Text = "Flower博客";
19 break;
20 case 3:
21 rssDS.Url = "http://www.livebaby.cn/blog/rss2.asp";
22 lsBlog.DataBind();
23 lblHeader.Text = "活力宝贝博客网";
24 break;
25 case 4:
26 rssDS.Url = "http://www.livebaby.cn/blog/u/yoyo/rss2.xml";
27 lsBlog.DataBind();
28 lblHeader.Text = "悠悠宝贝的博客";
29 break;
30 case 5:
31 rssDS.Url = "http://www.cnblogs.com/meil/rss";
32 lsBlog.DataBind();
33 lblHeader.Text = "向东博客园博客";
34 break;
35 case 6:
36 rssDS.Url = "http://www.cnblogs.com/rss";
37 lsBlog.DataBind();
38 lblHeader.Text = "博客园";
39 break;
40 default:
41 break;
42 }
43 }
源码下载地址:http://www.cnblogs.com/Files/meil/ReaderRss_src.rar
本文永久地址: http://www.livebaby.cn/blog/u/meil/archives/2007/1169.html
在之前我们如果要实现博客的RSS订阅,通常都需要手写代码去生产或读取XML。现在有了RSSToolKit,这一切就变得简单了。你可以使用他在五分钟内实现自己的 Rss 在线阅读器。这篇文章将介绍如何读取站点 Rss 信息。
开发环境:VS2005 + RSSToolKit
一、首先我们需要建立一个ASP.NET AJAX站点
二、引入RssToolKit到项目中,建好的项目如下(CSS和图片文件可以使用我压缩文档里的)
三、可以开始写代码了
1.首先需要一个ScriptManager、一个UpdatePanel、一个UpdateProgress。哈哈,都是废话AJAX页面程序大概都需要这些。其他的就是你的要求了。具体的页面代码如下:
1 <%@ Page Language="C#" AutoEventWireup="true" CodeFile="Default.aspx.cs" Inherits="_Default" %>
2
3 <%@ Register Assembly="RssToolkit" Namespace="RssToolkit" TagPrefix="Rss" %>
4 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
5 <html xmlns="http://www.w3.org/1999/xhtml">
6 <head runat="server">
7 <title>向东博客阅读器|meil.livebaby.cn</title>
8 <link href="CSS/Layout.css" rel="stylesheet" type="text/css" />
9
10 <script language="JavaScript" type="text/javascript">
11 var ls;
12 function ls_onClk(itemNumber) {
13
14 if(ls == null) ls = $get("List0");
15
16 ls.className = "";
17 ls = $get("list" + itemNumber);
18 ls.className = "current";
19 return true;
20 }
21 </script>
22
23 </head>
24 <body>
25 <form id="form1" runat="server">
26 <asp:ScriptManager ID="ScriptManager1" runat="server" />
27 <div id="content-header">
28 <h1><asp:HyperLink ID="HyperLink1" runat="server" Text="向东" Target="_blank" NavigateUrl="http://meil.livebaby.cn/index.html"></asp:HyperLink>
29 博客阅读器</h1>
30 </div>
31 <div id="content-container">
32 <div id="content-side1">
33 <ul class="list-of-links">
34 <li id="list0" class="current">
35 <asp:LinkButton ID="lb0" runat="server" CommandArgument="0" OnClientClick="ls_onClk(0);" OnCommand="lnk_cmd">向东博客</asp:LinkButton></li>
36 <li id="list1">
37 <asp:LinkButton ID="lb1" runat="server" CommandArgument="1" OnClientClick="ls_onClk(1);" OnCommand="lnk_cmd">财经博客</asp:LinkButton></li>
38 <li id="list2">
39 <asp:LinkButton ID="lb2" runat="server" CommandArgument="2" OnClientClick="ls_onClk(2);" OnCommand="lnk_cmd">Flower博客</asp:LinkButton></li>
40 <li id="list3">
41 <asp:LinkButton ID="lb3" runat="server" CommandArgument="3" OnClientClick="ls_onClk(3);" OnCommand="lnk_cmd">活力宝贝博客网</asp:LinkButton></li>
42 <li id="list4">
43 <asp:LinkButton ID="lb4" runat="server" CommandArgument="4" OnClientClick="ls_onClk(4);" OnCommand="lnk_cmd">悠悠宝贝的博客</asp:LinkButton></li>
44 <li id="list5">
45 <asp:LinkButton ID="lb5" runat="server" CommandArgument="5" OnClientClick="ls_onClk(5);" OnCommand="lnk_cmd"><font color="red">向东博客园博客</font></asp:LinkButton></li>
46 <li id="li6">
47 <asp:LinkButton ID="lb6" runat="server" CommandArgument="6" OnClientClick="ls_onClk(6);" OnCommand="lnk_cmd"><font color="red">博客园</font></asp:LinkButton></li>
48 </ul>
49 </div>
50 <div id="content-main">
51 <asp:UpdatePanel ID="updateMain" runat="server" UpdateMode="conditional" >
52 <Triggers>
53 <asp:AsyncPostBackTrigger ControlID="lb0" />
54 <asp:AsyncPostBackTrigger ControlID="lb1" />
55 <asp:AsyncPostBackTrigger ControlID="lb2" />
56 <asp:AsyncPostBackTrigger ControlID="lb3" />
57 <asp:AsyncPostBackTrigger ControlID="lb4" />
58 <asp:AsyncPostBackTrigger ControlID="lb5" />
59 <asp:AsyncPostBackTrigger ControlID="lb6" />
60 </Triggers>
61 <ContentTemplate>
62 <h2><asp:Label ID="lblHeader" runat="server">最新日志</asp:Label></h2>
63 <hr />
64 <asp:Panel ID="pnlBlog" runat="server">
65 <Rss:RssDataSource ID="rssDS" runat="server" MaxItems="0" Url=""></Rss:RssDataSource>
66 <asp:DataList ID="lsBlog" runat="server" DataSourceID="rssDS">
67 <ItemTemplate>
68 <asp:Panel ID="panelHeader" runat="server" Style="cursor: pointer; color: #d61719;width: 100%; display: block;">
69 <span style="float: left;"><%# Eval("title") %></span>
70 <asp:Image ID="Image1" runat="server" Style="float: right;" ImageUrl="~/images/expand_blue.jpg" />
71 </asp:Panel>
72 <asp:Panel ID="Panel1" runat="server" Style="margin-top: 3px;width: 100%; background: transparent url(images/blogBack.gif) no-repeat text-top left;">
73 <%# Eval("description") %>
74 (<asp:HyperLink ID="hlMore" runat="server" NavigateUrl='<%# Eval("link") %>' Target="_blank" Text="更多内容"></asp:HyperLink>)
75 </asp:Panel>
76 <ajaxT:CollapsiblePanelExtender ID="cpe1" runat="server" TargetControlID="Panel1"
77 ExpandControlID="panelHeader" CollapseControlID="panelHeader" SuppressPostBack="true"
78 ImageControlID="Image1" Collapsed="true" ExpandedImage="~/images/collapse_blue.jpg"
79 CollapsedImage="~/images/expand_blue.jpg" />
80 <hr style="border-bottom: 1px dotted #B2B2B2; margin: 0px;" />
81 </ItemTemplate>
82 </asp:DataList>
83 </asp:Panel>
84 </ContentTemplate>
85 </asp:UpdatePanel>
86 </div>
87 </div>
88 <asp:UpdateProgress ID="UpdateProgress1" runat="server" DisplayAfter="0" DynamicLayout="true">
89 <ProgressTemplate>
90 <div id="updProgress">
91 <img alt="" src="images/indicator.gif" />
92 <span>数据获取中</span>
93 </div>
94 </ProgressTemplate>
95 </asp:UpdateProgress>
96 </form>
97 <center><div><a href="http://meil.livebaby.cn">meil.livebaby.cn</a> 程序制作:向东 2007.7</center>
98 </body>
99 </html>
100
比较重要的是这两部分:
行66:<Rss:RssDataSource ID="rssDS" runat="server" MaxItems="0" Url=""></Rss:RssDataSource>
这就是实现RSS读取的核心了,有了这个标记就实现了RSS读取的一半工作,那剩下的吶?
看看下面者部分,lnk_cmd 命令实现了RSS数据的重绑定,这样你就可以实时的访问多个RSS地址了。如果你觉得这样还不够灵活,可以加个Textbox,然后用程序去绑定,这样也不错。不过,此次就不实现这个了,有兴趣的朋友可以试试,应该不难。哈哈!
复制代码 代码如下:
行35:<asp:LinkButton ID="lb0" runat="server" CommandArgument="0" OnClientClick="ls_onClk(0);"
OnCommand="lnk_cmd">向东博客</asp:LinkButton></li>
1 protected void lnk_cmd(object sender, CommandEventArgs e)
2 {
3 int command = Convert.ToInt32(e.CommandArgument);
4
5 rssDataBind(command);
6 }
rssDataBind就是绑定的函数,代码是:
1 protected void rssDataBind(int cmd)
2 {
3 switch (cmd)
4 {
5 case 0:
6 rssDS.Url = "http://www.livebaby.cn/blog/u/meil/rss2.xml";
7 lsBlog.DataBind();
8 lblHeader.Text = "向东博客";
9 break;
10 case 1:
11 rssDS.Url = "http://www.livebaby.cn/blog/u/money/rss2.xml";
12 lsBlog.DataBind();
13 lblHeader.Text = "财经博客";
14 break;
15 case 2:
16 rssDS.Url = "http://www.livebaby.cn/blog/u/flower/rss2.xml";
17 lsBlog.DataBind();
18 lblHeader.Text = "Flower博客";
19 break;
20 case 3:
21 rssDS.Url = "http://www.livebaby.cn/blog/rss2.asp";
22 lsBlog.DataBind();
23 lblHeader.Text = "活力宝贝博客网";
24 break;
25 case 4:
26 rssDS.Url = "http://www.livebaby.cn/blog/u/yoyo/rss2.xml";
27 lsBlog.DataBind();
28 lblHeader.Text = "悠悠宝贝的博客";
29 break;
30 case 5:
31 rssDS.Url = "http://www.cnblogs.com/meil/rss";
32 lsBlog.DataBind();
33 lblHeader.Text = "向东博客园博客";
34 break;
35 case 6:
36 rssDS.Url = "http://www.cnblogs.com/rss";
37 lsBlog.DataBind();
38 lblHeader.Text = "博客园";
39 break;
40 default:
41 break;
42 }
43 }
rssDS.Url = "http://www.livebaby.cn/blog/u/meil/rss2.xml";
lsBlog.DataBind();
是不是就如DB数据的绑定。MS的东西虽然结构性不好,但是上手真的好快。
到底需要多少个Case就看你的需要了。我这里就绑定了六个RSS地址,你还可以更多,但要注意的是一定要和页面上的LinkButton数对应上。
最终的C#代码如下:
复制代码 代码如下:
1 protected void rssDataBind(int cmd)
2 {
3 switch (cmd)
4 {
5 case 0:
6 rssDS.Url = "http://www.livebaby.cn/blog/u/meil/rss2.xml";
7 lsBlog.DataBind();
8 lblHeader.Text = "向东博客";
9 break;
10 case 1:
11 rssDS.Url = "http://www.livebaby.cn/blog/u/money/rss2.xml";
12 lsBlog.DataBind();
13 lblHeader.Text = "财经博客";
14 break;
15 case 2:
16 rssDS.Url = "http://www.livebaby.cn/blog/u/flower/rss2.xml";
17 lsBlog.DataBind();
18 lblHeader.Text = "Flower博客";
19 break;
20 case 3:
21 rssDS.Url = "http://www.livebaby.cn/blog/rss2.asp";
22 lsBlog.DataBind();
23 lblHeader.Text = "活力宝贝博客网";
24 break;
25 case 4:
26 rssDS.Url = "http://www.livebaby.cn/blog/u/yoyo/rss2.xml";
27 lsBlog.DataBind();
28 lblHeader.Text = "悠悠宝贝的博客";
29 break;
30 case 5:
31 rssDS.Url = "http://www.cnblogs.com/meil/rss";
32 lsBlog.DataBind();
33 lblHeader.Text = "向东博客园博客";
34 break;
35 case 6:
36 rssDS.Url = "http://www.cnblogs.com/rss";
37 lsBlog.DataBind();
38 lblHeader.Text = "博客园";
39 break;
40 default:
41 break;
42 }
43 }
源码下载地址:http://www.cnblogs.com/Files/meil/ReaderRss_src.rar
本文永久地址: http://www.livebaby.cn/blog/u/meil/archives/2007/1169.html
最新更新
Objective-C语法之代码块(block)的使用
VB.NET eBook
Add-in and Automation Development In VB.NET 2003 (F
Add-in and Automation Development In VB.NET 2003 (8
Add-in and Automation Development in VB.NET 2003 (6
Add-in and Automation Development In VB.NET 2003 (5
AddIn Automation Development In VB.NET 2003 (4)
AddIn And Automation Development In VB.NET 2003 (2)
Addin and Automation Development In VB.NET 2003 (3)
AddIn And Automation Development In VB.NET 2003 (1)
2个场景实例讲解GaussDB(DWS)基表统计信息估
常用的 SQL Server 关键字及其含义
动手分析SQL Server中的事务中使用的锁
openGauss内核分析:SQL by pass & 经典执行
一招教你如何高效批量导入与更新数据
天天写SQL,这些神奇的特性你知道吗?
openGauss内核分析:执行计划生成
[IM002]Navicat ODBC驱动器管理器 未发现数据
初入Sql Server 之 存储过程的简单使用
SQL Server -- 解决存储过程传入参数作为s
武装你的WEBAPI-OData入门
武装你的WEBAPI-OData便捷查询
武装你的WEBAPI-OData分页查询
武装你的WEBAPI-OData资源更新Delta
5. 武装你的WEBAPI-OData使用Endpoint 05-09
武装你的WEBAPI-OData之API版本管理
武装你的WEBAPI-OData常见问题
武装你的WEBAPI-OData聚合查询
OData WebAPI实践-OData与EDM
OData WebAPI实践-Non-EDM模式