先看两个例子:
这里还有更多提供/支持这种服务的链接:http://www.odata.org/blog/2010/10/28/new-odata-producers-and-consumers
这是什么?
开放数据协议(oData)让你重新认识 HTTP 协议并且简化数据在网上的发布和更新过程。参看在 cnblogs 查到的唯一介绍它的新闻:http://news.cnblogs.com/n/69756/ 和一篇写在 VS 2010 RC 时候的简介:http://www.cnblogs.com/shanyou/archive/2010/02/11/1667381.html
说正题: 用 VS 2010 + .NET V4,几乎可以不用写代码就把完整的数据服务发布到网上。步骤如下:
假设你已经有一个数据库,用户可以发围脖和订阅别人的围脖,数据结构如下,
要把它变成一个网络数据服务:
1、在VS 2010 建一个Web应用或网站,加一个数据模型:
2、把数据库里的表加进来:
|
把默认生成的关联属性名字改改,改好就像右边这样: |
|
3、加一个新的 WCF Data Service 网页:
4、打开它的 CS 文件,
代码
1
public
class
messages : DataService
<
/*
TODO: put your data source class name here
*/
>
2
{
3
//
This method is called only once to initialize service-wide policies.
4
public
static
void
InitializeService(DataServiceConfiguration config)
5
{
6
//
TODO: set rules to indicate which entity sets and service operations are visible, updatable, etc.
7
//
Examples:
8
//
config.SetEntitySetAccessRule("MyEntityset", EntitySetRights.AllRead);
9
//
config.SetServiceOperationAccessRule("MyServiceOperation", ServiceOperationRights.All);
10
config.DataServiceBehavior.MaxProtocolVersion
=
DataServiceProtocolVersion.V2;
11
}
12
}
改成下面这个样子(基本上就是把注释去掉,把刚才的数据模型加进来):
代码
1
public
class
messages : DataService
<
MessageEntities
>
2
{
3
public
static
void
InitializeService(DataServiceConfiguration config)
4
{
5
config.SetEntitySetAccessRule(
"
*
"
, EntitySetRights.AllRead);
6
config.SetServiceOperationAccessRule(
"
*
"
, ServiceOperationRights.All);
7
config.DataServiceBehavior.MaxProtocolVersion
=
DataServiceProtocolVersion.V2;
8
}
9
}
5、没了,你的数据服务已经在网上。
浏览你的SVC网页,可以看到:
代码
1
<?
xml version="1.0" encoding="utf-8" standalone="yes"
?>
2
<
service
xml:base
="http://localhost:38791/messages.svc/"
xmlns:atom
="http://www.w3.org/2005/Atom"
xmlns:app
="http://www.w3.org/2007/app"
xmlns
="http://www.w3.org/2007/app"
>
3
<
workspace
>
4
<
atom:title
>
Default
</
atom:title
>
5
<
collection
href
="Posts"
>
6
<
atom:title
>
Posts
</
atom:title
>
7
</
collection
>
8
<
collection
href
="Subscriptions"
>
9
<
atom:title
>
Subscriptions
</
atom:title
>
10
</
collection
>
11
<
collection
href
="Users"
>
12
<
atom:title
>
Users
</
atom:title
>
13
</
collection
>
14
</
workspace
>
15
</
service
>
16
浏览service.svc/Users,可以看到用户列表:
代码
<?
xml version="1.0" encoding="utf-8" standalone="yes"
?>
<
feed
xml:base
="http://localhost:38791/messages.svc/"
xmlns:d
="http://schemas.microsoft.com/ado/2007/08/dataservices"
xmlns:m
="http://schemas.microsoft.com/ado/2007/08/dataservices/metadata"
xmlns
="http://www.w3.org/2005/Atom"
>
<
title
type
="text"
>
Users
</
title
>
<
id
>
http://localhost:38791/messages.svc/Users
</
id
>
<
updated
>
2010-12-20T19:22:12Z
</
updated
>
<
link
rel
="self"
title
="Users"
href
="Users"
/>
<
entry
>
<
id
>
http://localhost:38791/messages.svc/Users(1)
</
id
>
<
title
type
="text"
/>
<
updated
>
2010-12-20T19:22:12Z
</
updated
>
<
author
>
<
name
/>
</
author
>
<
link
rel
="edit"
title
="User"
href
="Users(1)"
/>
<
link
rel
="http://schemas.microsoft.com/ado/2007/08/dataservices/related/Posts"
type
="application/atom+xml;type=feed"
title
="Posts"
href
="Users(1)/Posts"
/>
<
link
rel
="http://schemas.microsoft.com/ado/2007/08/dataservices/related/Followers"
type
="application/atom+xml;type=feed"
title
="Followers"
href
="Users(1)/Followers"
/>
<
link
rel
="http://schemas.microsoft.com/ado/2007/08/dataservices/related/Subscriptions"
type
="application/atom+xml;type=feed"
title
="Subscriptions"
href
="Users(1)/Subscriptions"
/>
<
category
term
="Message.DataModel.User"
scheme
="http://schemas.microsoft.com/ado/2007/08/dataservices/scheme"
/>
<
content
type
="application/xml"
>
<
m:properties
>
<
d:id
m:type
="Edm.Int32"
>
1
</
d:id
>
<
d:name
>
Test
</
d:name
>
</
m:properties
>
</
content
>
</
entry
>
</
feed
>
总结
为什么叫开放数据协议?因为它跨语言和平台的,基于http地址的数据服务。
例子:
列出所有的用户:service.svc/Users
找一个叫张三的用户:service.svc/Users?$filter=Name eq '张三'
他发的围脖(假设前一个查询返回了他的ID):service.svc/Users(1)/Posts
他的Fans: service.svc/Users(1)/Followers
他发的关于cnblogs的围脖:service.svc/Posts?$filter=userId eq 1 and indexof(content, 'cnblogs') ge 0
这些看起来并不难,但好处是,它们都不需要写任何代码,而且它是RESTful的,任何可以访问URL的语言,平台都可以用它。除此以外,这只是GET操作,POST,DELETE等其他标准HTTP操作也是原生支持的。所以,它是完整的数据服务,并不仅仅是数据查询。
如果大家有兴趣,我会继续写这个主题,比如在WPF使用这种服务,在JavaScript使用(Built in JSON support, 哈哈),并涉及一些更深的,实际项目的内容,比如数据安全,数据事务。
题外话, 为什么是另一个?很久很久以前,SQL Server曾经有过Web Service 的服务,但M$做了一个艰难的决定,把它在后续版本中移除了。由于 Entity Framework, WCF data service in .NET V4的加持,这种服务又换了一个方式回来了。
题外外话,斗转星移,离上一篇文章又两年过去了,地方没变,人老了。
人老记性就不好,这个给忘了:要修给IE的一个设置,让它不自动 turn on feed view,不然你看到就是IE格式化过的内容了,odata返回的是,人也可以吃,IE也可以吃的 Atom xml.