开放数据协议(OData)凡是一个询问与翻新数据的Web协议。OData是依据诸如HTTP和AtomPub的国际标准创建的,它提供了一个跨平台的多少通信的方案。OData用了web技术如果HTTP、Atom发布协议(AtomPub)和JSON等来提供对两样应用程序,服务及贮的消息看。SharePoint
2010, SQL Server 2008 R2, PowerPivot, Windows Azure Table Storage,
和老三方的出品像 IBM’s WebSphere eXtreme
Scale都使用OData。

第一,WCF Data
Services是WCF服务,所以若可采取有现有的WCF知识。其次,WCF Data
Services已经落实了OData拓扑,于是你可从事为公的数据格式在你的顺序中的意味,而休是AtomPub/JSON这些真的在网及传递的数目格式。再有,WCF
Data
Services致力为数传,而无是数码存储。你的多少足以存放于旁岗位:本地的数据库,云端的数据库,外部的web
services,xml文件,等等。无论数额是怎么来之,你还足以为此同一的法来揭晓/使用它们。

以Visual Studio 2010里头下WCF Data
Service,就是应用OData发布之Restful服务,下面的例子演示2010里头的WCF
Data Service.

1、创建一个数据库,使用SQL Server Management Studio并运行
夫本子.

图片 1

创造了数据库,包含两只表Categories和Products,两只表里头分别插入了2长条记下。

2、创建一个Web Application,然后创建一个Entity Data Model,如下图所示

图片 2

3、创建一个Data Service暴露我们的范:

using System;
using System.Collections.Generic;
using System.Data.Services;
using System.Data.Services.Common;
using System.Linq;
using System.ServiceModel.Web;
using System.Web;

namespace MyWebsite
{
    public class ProductService :
DataService<GettingStartedWithUpdateEntities>
    {
        // This method is called only once to initialize service-wide
policies.
        public static void InitializeService(DataServiceConfiguration
config)
        {
            // TODO: set rules to indicate which entity sets and service
operations are visible, updatable, etc.
            // Examples:
            config.SetEntitySetAccessRule(“*”,
EntitySetRights.AllRead);
            config.SetServiceOperationAccessRule(“*”,
ServiceOperationRights.All);
            config.DataServiceBehavior.MaxProtocolVersion =
DataServiceProtocolVersion.V2;
        }
    }
}

4、验证ProductService服务,在浏览器中查看ProductService.svc,如下图所示:

图片 3

达图的始末就是是AtomPub协议,首先,您为服务器的Atom链接发起带验证的GET请求(authenticated
GET),以抱有关当前可用服的描述。服务器返回了一个(描述)Atom服务的XML文件,其中列有了有的列workspace,每个workspace包含相应的collection集合。一个workspace可能是一个博客,wiki命名空间要内容聚合等通过你用户名/密码可以看的资源。

每个workspace可含蓄五种类型的聚众:条目(entries),类别(categories),模板(templates),用户(users)和购并资源(generic
resources)。

既然一个workspace是一个产品,那麽产品一般都含一多级的章,产品等等这样的集。所有这些聚集都通过与HTTP谓词所指代的同的方式(GET,POSTD,ELETE,PUT)处理和作出响应。所有这些(集合)支持分页,因此,服务器可以以collections以一个轻处理的数块方式回。同时还支持按日期查询(集合),因此,您可以经过开和终结日期过滤器来过滤collections。

为了博一个collection,可以往网址(就是服务文档collection的’ href
‘列有之地址)
发起一个GET请求。服务文档为每个collection都指定了一个URI。如果你于一个URI
发出GET请求,你晤面获得一个包含Atom
Collection的XML文件,其中列有了前方X个该collection中的分子。如果collection中之积极分子多于X只,那么该文件还拿富含对下一样批成员的URI,您可以它来收获下同样批成员。您为堪当HTTP的脑瓜儿通过Range来指定一日期界定,这样可界定返回的collection只包含那些在开头同收日期内的章。

 

 

俺们已经有了一个暴露V2 版本的OData
Protocol的劳务ProductService.svc,下面我创建一个WPF应用程序来花费这个服务。

5、创建一个WPF应用程序,并累加ProductService.svc的劳动引用。

图片 4

足使一个插件Open Data Protocol
Visualizer
翻看服务返回的OData数据数据,这个家伙的取得和安可参照VS2010的扩展。可以由此劳务引用的“View
in Diagram”进行查。

图片 5 

下图是ProductService.svc的的OData Model Brower:

图片 6

6、添加一个ViewModel,封装DataServiceContext,充当WPF表单和Data
Service交互的中介。

public class ViewModel
{
       private GettingStartedWithUpdateEntities _ctx;
       private Category[] _categories;
       private DataServiceCollection<Product> _products;

       public ViewModel()
       {
           _ctx = new GettingStartedWithUpdateEntities(
               new
Uri(“http://localhost:1812/ProductService.svc/%22));))
           Load();
       }

       public DataServiceCollection<Product> Products
       {
           get
           {
               return _products;
           }
       }

       public Category[] Categories
       {
           get
           {
               return _categories;
           }
       }

       public void SaveChanges()
       {
           _ctx.SaveChanges();
           Load();
       }

       public void Load()
       {
           _categories = _ctx.Categories.ToArray();
           _products = new
DataServiceCollection<Product>(_ctx);
           _products.Load(from p in _ctx.Products.Expand(“Category”)
                          select p);
       }
   }

7、制作WPF表单

<Window x:Class=”MyClientapp.MainWindow”
       
xmlns=”http://schemas.microsoft.com/winfx/2006/xaml/presentation%22
        xmlns:x=”http://schemas.microsoft.com/winfx/2006/xaml%22
        Title=”Products Catalog” Height=”400″ Width=”425″>
    <Grid>
        <StackPanel Orientation=”Horizontal”>
            <Grid Margin=”0,0,0,0″ Name=”grid1″ Width=”140″ >
                <ListBox ItemsSource=”{Binding Path=Products}”
                         Name=”Products”
                         IsSynchronizedWithCurrentItem=”True”>
                    <ListBox.ItemTemplate>
                        <DataTemplate>
                            <StackPanel
Orientation=”Horizontal”>
                                <TextBlock Text=”{Binding Path=Name}”
FontWeight=”Bold”/>
                            </StackPanel>
                        </DataTemplate>
                    </ListBox.ItemTemplate>
                </ListBox>
            </Grid>
            <StackPanel Orientation=”Vertical” Width=”260″>
                <StackPanel Orientation=”Horizontal”>
                    <Label Name=”lblName” Width=”100″>
                        <TextBlock
Width=”150″>Name:</TextBlock>
                    </Label>
                    <TextBox Name=”txtName”
                             Text=”{Binding ElementName=Products,
Path=SelectedItem.Name, Mode=TwoWay}”
                             Width=”150″/>
                </StackPanel>
                <StackPanel Orientation=”Horizontal”>
                    <Label Name=”lblCost” Width=”100″>
                        <TextBlock Width=”150″
>Cost:</TextBlock>
                    </Label>
                    <TextBox Name=”txtCost”
                             Text=”{Binding ElementName=Products,
Path=SelectedItem.Cost, Mode=TwoWay}”
                             Width=”150″/>
                </StackPanel>
                <StackPanel Orientation=”Horizontal”>
                    <Label Name=”lblCategory” Width=”100″>
                        <TextBlock>Category:</TextBlock>
                    </Label>
                    <ComboBox   Name=”cmbCategory”
                                ItemsSource=”{Binding
Path=Categories}”
                                DisplayMemberPath=”Name”
                                SelectedValuePath=”.”
                                SelectedValue=”{Binding
ElementName=Products, Path=SelectedItem.Category, Mode=TwoWay}”
                                Width=”140″ />
                </StackPanel>
                <Button Height=”23″
                        HorizontalAlignment=”Right”
                        Name=”btnSaveChanges”
                        VerticalAlignment=”Bottom”
                        Width=”136″
                        Click=”btnSaveChanges_Click”>Save
Changes</Button>
            </StackPanel>
        </StackPanel>
    </Grid>
</Window>

编纂如下codebehind代码:

namespace MyClientapp
{
    /// <summary>
    /// Interaction logic for MainWindow.xaml
    /// </summary>
    public partial class MainWindow : Window
    {
        ViewModel viewmodel = new ViewModel();

        public MainWindow()
        {
            InitializeComponent();
            this.cmbCategory.DataContext = viewmodel;
            this.grid1.DataContext = viewmodel;
        }

        private void btnSaveChanges_Click(object sender,
RoutedEventArgs e)
        {
            viewmodel.SaveChanges();
            this.grid1.DataContext = viewmodel;
        }

    }
}

 

 

运行程序结果如下:

图片 7

 

本文代码下载:http://files.cnblogs.com/shanyou/MyWebsite.zip

 

参考资源:

  • Breaking Down ‘Data Silos’ – The Open Data Protocol
    (OData)
  • Getting Started with the Data Services Update for .NET 3.5 SP1 –
    Part
    1
  • Getting Started with the Data Service Update for .NET 3.5 SP1 –
    Part
    2
  • Introducing the Microsoft Open Data Protocol Visualizer
    (CTP1)
  • http://weblogs.asp.net/cazzu/archive/2010/06/08/wcf-data-service-pipeline.aspx

相关文章

网站地图xml地图