实例理解WCF数据服务

开发 后端
简而言之:如果使用WCF数据服务,就可以通过Rest的方式来访问和更改数据。我们今天将透过实例讲解WCF数据服务。

  Msdn解释:

简而言之:如果使用WCF数据服务,就可以通过Rest的方式来访问和更改数据。

  实战:

  1:新建Asp.net 空Web应用程序:

  2:因为WCF数据服务需要ado.net 实体,所以添加一个实体,命名为Northwind

3:添加了数据实体后,需要添加一个WCF数据服务

NorthwindWcfDataService.cs 代码如下:

 

  1.   namespaceNorthwindDataServiceDemo  
  2.   {  
  3.   publicclassNorthwindWcfDataService: DataService</* TODO: 在此放置数据源类名*/>  
  4.   {  
  5.   // 仅调用此方法一次以初始化涉及服务范围的策略。  
  6.   publicstaticvoidInitializeService(DataServiceConfigurationconfig)  
  7.   {  
  8.   // TODO: 设置规则以指明哪些实体集和服务操作是可见的、可更新的,等等。  
  9.   // 示例:  
  10.   // config.SetEntitySetAccessRule("MyEntityset", EntitySetRights.AllRead);  
  11.   // config.SetServiceOperationAccessRule("MyServiceOperation", ServiceOperationRights.All);  
  12.   config.DataServiceBehavior.MaxProtocolVersion = DataServiceProtocolVersion.V2;  
  13.   }  
  14.   }  
  15.   }  
  16.   publicclassNorthwindWcfDataService: DataService</* TODO: 在此放置数据源类名*/

 

  在此放置数据源类名,在这里作为数据源的是Northwind.edmx 生成的NorthwindEntities。

  将代码修改为:

  publicclassNorthwindWcfDataService: DataService<NorthwindEntities>

  因为需要设置规则来指明哪些实体集和服务操作是可见的、可更新的,等等。

  所以将

 

  1.   // config.SetEntitySetAccessRule("MyEntityset", EntitySetRights.AllRead);  
  2.   // config.SetServiceOperationAccessRule("MyServiceOperation", ServiceOperationRights.All); 

 

  修改为:

 

  1.   config.SetEntitySetAccessRule("*", EntitySetRights.All);  
  2.   config.SetServiceOperationAccessRule("*", ServiceOperationRights.All); 

 

  完整的代码如下:

 

  1.   namespaceNorthwindDataServiceDemo  
  2.   {  
  3.   publicclassNorthwindWcfDataService: DataService<NorthwindEntities>  
  4.   {  
  5.   // 仅调用此方法一次以初始化涉及服务范围的策略。  
  6.   publicstaticvoidInitializeService(DataServiceConfigurationconfig)  
  7.   {  
  8.   // TODO: 设置规则以指明哪些实体集和服务操作是可见的、可更新的,等等。  
  9.   // 示例:  
  10.   // config.SetEntitySetAccessRule("MyEntityset", EntitySetRights.AllRead);  
  11.   // config.SetServiceOperationAccessRule("MyServiceOperation", ServiceOperationRights.All);  
  12.   config.SetEntitySetAccessRule("*", EntitySetRights.All);  
  13.   config.SetServiceOperationAccessRule("*", ServiceOperationRights.All);  
  14.   config.DataServiceBehavior.MaxProtocolVersion = DataServiceProtocolVersion.V2;  
  15.   }  
  16.   }  
  17.   } 

 

  4:所有一切都操作完毕后,可以在浏览器中查看。

好了,现在数据服务已经实现了,剩下的就是使用客户端来调用了。

  创建控制台程序来调用WCF数据服务

  1:添加控制台应用程序:

2:添加服务引用:

3:修改Program.cs 代码如下:

 

  1.   namespaceNorthwindConsoleApp  
  2.   {  
  3.   classProgram  
  4.   {  
  5.   staticvoidMain(string[] args)  
  6.   {  
  7.   UriserviceRootUri = newUri("http://localhost:34098/NorthwindWcfDataService.svc/");  
  8.   NorthwindService.NorthwindEntitiesnorthwindContext =  
  9.   newNorthwindService.NorthwindEntities(serviceRootUri);  
  10.   varproducts = northwindContext.Products.ToList();  
  11.   foreach(varproduct inproducts)  
  12.   {  
  13.   Console.WriteLine("{0},{1}", product.ProductID, product.ProductName);  
  14.   }  
  15.   Console.ReadLine();  
  16.   }  
  17.   }  
  18.   } 

 

  这段代码主要是查询Products,

  因为使用了WCF数据服务,所以客户端可以使用linq的方式来查询数据,从本质的角度来分析的话,不同的Linq查询在后台都会变成不同http请求地址,具体的请求地址可以查看RequestUri属性。

  结果如下:

在这里可以看到Order_Details 的count 为0,

  如果想要在查询Products的时候,同时查询所有的Order_Details 那么可以将代码修改如下:

  varproducts = northwindContext.Products.ToList();

  改为

  varproducts = northwindContext.Products.Expand("Order_Details").ToList();

  完整的代码如下:

 

  1.   staticvoidMain(string[] args)  
  2.   {  
  3.   UriserviceRootUri = newUri("http://localhost:34098/NorthwindWcfDataService.svc/");  
  4.   NorthwindService.NorthwindEntitiesnorthwindContext =  
  5.   newNorthwindService.NorthwindEntities(serviceRootUri);  
  6.   varproducts = northwindContext.Products.Expand("Order_Details").ToList();  
  7.   foreach(varproduct inproducts)  
  8.   {  
  9.   Console.WriteLine("id:{0},Name:{1},Orders:{2}",  
  10.   product.ProductID,  
  11.   product.ProductName,  
  12.   product.Order_Details.Count);  
  13.   }  
  14.   Console.ReadLine();  
  15.   } 

 

3:使用Silverlight来调用WCF数据服务。

  1:创建Silverlight应用程序

2:MainPage.xaml 代码如下:

 

  1. <UserControlxmlns:sdkUserControlxmlns:sdk="http://schemas.microsoft.com/winfx/2006/xaml/presentation/sdk" x:Class="NorthwindSilverlightApp.MainPage" 
  2. xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
  3. xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
  4. xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
  5. xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
  6. mc:Ignorable="d" 
  7. dd:DesignHeight="300"d:DesignWidth="400">  xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
  8.  xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
  9. xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
  10.   xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
  11.   mc:Ignorable="d" 
  12.   dd:DesignHeight="300"d:DesignWidth="400"> 
  13.   <Gridx:NameGridx:Name="LayoutRoot"Background="White"> 
  14.   <Grid.RowDefinitions> 
  15.   <RowDefinitionHeightRowDefinitionHeight="Auto" /> 
  16.   <RowDefinitionHeightRowDefinitionHeight="*" /> 
  17.   </Grid.RowDefinitions> 
  18.   <StackPanelGrid.RowStackPanelGrid.Row="0"HorizontalAlignment="Left" > 
  19.   <ButtonContentButtonContent="First"Click="First_Click" /> 
  20.   </StackPanel> 
  21.   <sdk:DataGridGrid.Rowsdk:DataGridGrid.Row="1"x:Name="dataGrid1" /> 
  22.   </Grid> 
  23.  </UserControl> 

 

  同理也需要添加服务引用:

3:MainPage.xaml.cs 代码如下:

 

  1.   namespaceNorthwindSilverlightApp  
  2.   {  
  3.   publicpartialclassMainPage: UserControl  
  4.   {  
  5.   publicMainPage()  
  6.   {  
  7.   InitializeComponent();  
  8.   }  
  9.   privatevoidFirst_Click(objectsender, RoutedEventArgse)  
  10.   {  
  11.   UriserviceRootUri = newUri("http://localhost:34098/NorthwindWcfDataService.svc/");  
  12.   NorthwindService.NorthwindEntitiesnorthwindContext =  
  13.   newNorthwindService.NorthwindEntities(serviceRootUri);  
  14.   try 
  15.   {  
  16.   varproducts = northwindContext.Products.ToList();  
  17.   dataGrid1.ItemsSource = products;  
  18.   }  
  19.   catch(Exceptionex)  
  20.   {  
  21.   MessageBox.Show(ex.Message);  
  22.   }  
  23.   }  
  24.   }  
  25.   } 

 

  4:运行,结果如下:

这是因为Silverlight 只支持异步操作,而

  varproducts = northwindContext.Products.ToList();

  使用的是同步操作

  修改First_Click 代码如下:

 

  1.   privatevoidFirst_Click(objectsender, RoutedEventArgse)  
  2.   {  
  3.   UriserviceRootUri = newUri("http://localhost:34098/NorthwindWcfDataService.svc/");  
  4.   NorthwindService.NorthwindEntitiesnorthwindContext =  
  5.   newNorthwindService.NorthwindEntities(serviceRootUri);  
  6.   varproductsQuery = northwindContext.Products;  
  7.   northwindContext.BeginExecute<Product>(productsQuery.RequestUri,  
  8.   (ar) =>  
  9.   {  
  10.   varproducts = northwindContext.EndExecute<Product>(ar).ToList();  
  11.   dataGrid1.ItemsSource = products;  
  12.   },  
  13.   null);  
  14.   } 

 

  再次运行:

Silverlight 的异步

  修改MainPage.xaml 代码

 

  1. <StackPanelGrid.RowStackPanelGrid.Row="0"HorizontalAlignment="Left"Orientation="Horizontal" > 
  2.   <ButtonContentButtonContent="First"Click="First_Click" /> 
  3.   <ButtonContentButtonContent="Second"Click="Second_Click" /> 
  4.   </StackPanel> 

 

  之所以我在First_Click 中使用匿名委托是有原因的,因为如果你尝试写下面的代码会阻塞浏览器。

 

  1.   privatevoidSecond_Click(objectsender, RoutedEventArgse)  
  2.   {  
  3.   NorthwindService.NorthwindEntitiesnorthwindContext =  
  4.   newNorthwindService.NorthwindEntities(serviceRootUri);  
  5.   varproductsQuery = northwindContext.Products;  
  6.   IAsyncResultar = northwindContext.BeginExecute<Product>  
  7.   (productsQuery.RequestUri, nullnull);  
  8.   ar.AsyncWaitHandle.WaitOne();  
  9.   varproducts = northwindContext.EndExecute<Product>(ar).ToList();  
  10.   dataGrid1.ItemsSource = products;  
  11.   } 

 

  这个问题的原因是ar.AsyncWaitHandle是在UI线程上执行的,所以会阻塞UI线程。

  解决这个问题的方式也比较简单,使用ThreadPool或者是Task:

  修改代码如下,使用ThreadPool

 

  1.   privatevoidSecond_Click(objectsender, RoutedEventArgse)  
  2.   {  
  3.   NorthwindService.NorthwindEntitiesnorthwindContext =  
  4.   newNorthwindService.NorthwindEntities(serviceRootUri);  
  5.   varproductsQuery = northwindContext.Products;  
  6.   ThreadPool.QueueUserWorkItem((obj) =>  
  7.   {  
  8.   IAsyncResultar = northwindContext.BeginExecute<Product>  
  9.   (productsQuery.RequestUri, nullnull);  
  10.   ar.AsyncWaitHandle.WaitOne();  
  11.   varproducts = northwindContext.EndExecute<Product>(ar).ToList();  
  12.   dataGrid1.ItemsSource = products;  
  13.   });  
  14.   } 

 

  运行:

原因如下:

最后完整的代码如下:

 

  1.   privatevoidSecond_Click(objectsender, RoutedEventArgse)  
  2.   {  
  3.   NorthwindService.NorthwindEntitiesnorthwindContext =  
  4.   newNorthwindService.NorthwindEntities(serviceRootUri);  
  5.   varproductsQuery = northwindContext.Products;  
  6.   ThreadPool.QueueUserWorkItem((obj) =>  
  7.   {  
  8.   IAsyncResultar = northwindContext.BeginExecute<Product>  
  9.   (productsQuery.RequestUri, nullnull);  
  10.   ar.AsyncWaitHandle.WaitOne();  
  11.   varproducts = northwindContext.EndExecute<Product>(ar).ToList();  
  12.   Deployment.Current.Dispatcher.BeginInvoke(() =>  
  13.   {  
  14.   dataGrid1.ItemsSource = products;  
  15.   });  
  16.   });  
  17.   } 

 

  作者:LoveJenny

  出处:http://www.cnblogs.com/LoveJenny/    

原文链接:http://www.cnblogs.com/LoveJenny/archive/2012/02/13/2350020.html

【编辑推荐】

  1. WCF初接触实作之服务发布和使用
  2. 利用WCF实现将服务器端的错误信息返回
  3. 看WCF Web API的第一印象
  4. jQuery调用WCF开发实例经验分享
  5. 手把手教你如何应用WCF中的REST
责任编辑:彭凡 来源: 博客园
相关推荐

2016-09-08 23:47:17

大数据大数据服务

2009-11-05 16:01:51

WCF单调服务

2019-10-29 14:15:25

云存档数据服务技术

2021-05-21 14:19:45

数据服务API技术

2021-08-27 11:05:13

Commvault

2009-11-12 15:23:57

ADO.NET数据服务

2009-11-13 13:35:54

ADO.NET数据服务

2013-04-27 10:07:04

大数据全球技术峰会阿里淘宝

2015-07-31 16:26:46

IBM收购Compose

2009-12-22 16:14:01

WCF服务元数据

2016-10-17 09:33:24

大数据产业链场景应用

2010-03-02 14:06:37

WCF服务实例管理模式

2009-12-07 17:13:23

WCF技术

2014-06-18 10:50:09

大数据大数据服务神州数码

2009-11-19 17:08:55

Oracle数据服务器

2015-05-06 15:41:22

大数据服务HDFS云计算

2017-08-23 18:28:40

华为

2017-01-07 11:45:43

医疗健康大数据虚拟化

2023-09-28 11:42:15

2018-08-24 19:39:00

数据
点赞
收藏

51CTO技术栈公众号