实例理解WCF数据服务

  Msdn解释:

网站建设哪家好,找成都创新互联!专注于网页设计、网站建设、微信开发、成都小程序开发、集团企业网站建设等服务项目。为回馈新老客户创新互联还提供了弥渡免费建站欢迎大家使用!

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

  实战:

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

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

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

NorthwindWcfDataService.cs 代码如下:

 
 
 
 
  1.   namespaceNorthwindDataServiceDemo  
  2.   {  
  3.   publicclassNorthwindWcfDataService: DataService  
  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 

 

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

  将代码修改为:

  publicclassNorthwindWcfDataService: DataService

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

  所以将

 
 
 
 
  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  
  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. xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
  2. xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
  3. xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
  4. xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
  5. mc:Ignorable="d" 
  6. dd:DesignHeight="300"d:DesignWidth="400">  xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
  7.  xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
  8. xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
  9.   xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
  10.   mc:Ignorable="d" 
  11.   dd:DesignHeight="300"d:DesignWidth="400"> 
  12.    
  13.    
  14.    
  15.    
  16.    
  17.    
  18.    
  19.    
  20.    
  21.    
  22.   

 

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

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(productsQuery.RequestUri,  
  8.   (ar) =>  
  9.   {  
  10.   varproducts = northwindContext.EndExecute(ar).ToList();  
  11.   dataGrid1.ItemsSource = products;  
  12.   },  
  13.   null);  
  14.   } 

 

  再次运行:

Silverlight 的异步

  修改MainPage.xaml 代码

 
 
 
 
  1.  
  2.    
  3.    
  4.    

 

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

 
 
 
 
  1.   privatevoidSecond_Click(objectsender, RoutedEventArgse)  
  2.   {  
  3.   NorthwindService.NorthwindEntitiesnorthwindContext =  
  4.   newNorthwindService.NorthwindEntities(serviceRootUri);  
  5.   varproductsQuery = northwindContext.Products;  
  6.   IAsyncResultar = northwindContext.BeginExecute  
  7.   (productsQuery.RequestUri, null, null);  
  8.   ar.AsyncWaitHandle.WaitOne();  
  9.   varproducts = northwindContext.EndExecute(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  
  9.   (productsQuery.RequestUri, null, null);  
  10.   ar.AsyncWaitHandle.WaitOne();  
  11.   varproducts = northwindContext.EndExecute(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  
  9.   (productsQuery.RequestUri, null, null);  
  10.   ar.AsyncWaitHandle.WaitOne();  
  11.   varproducts = northwindContext.EndExecute(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

文章题目:实例理解WCF数据服务
文章链接:http://www.shufengxianlan.com/qtweb/news47/268297.html

网站建设、网络推广公司-创新互联,是专注品牌与效果的网站制作,网络营销seo公司;服务项目有等

广告

声明:本网站发布的内容(图片、视频和文字)以用户投稿、用户转载内容为主,如果涉及侵权请尽快告知,我们将会在第一时间删除。文章观点不代表本网站立场,如需处理请联系客服。电话:028-86922220;邮箱:631063699@qq.com。内容未经允许不得转载,或转载时需注明来源: 创新互联