微软同步框架入门之五--使用WCF同步远程数据

简介:
  在之前介绍的两个DEMO中,链接远程服务器所使用的方式都是通过数据库链接串。虽然可以简单的实现所期望的数据同步功能,但这样做有两个问题:

    1.不适合进行分布式布署.
    
    2.安全方面存在问题,因为在客户端会持有远程数据库服务器的链接帐号。
    
     因为这两个问题,导致了今天所要说的内容。当然在MSF中是支持采用WCF方式来进行远程数据访问的,而且WCF不仅可以用于数据同步,还可以进行文件同步(会在后续章节中进行介绍)。

     好了,费话少说,开始今天的正文吧。
    
     下面简要介绍一下今天DEMO的一个具体开发流程。
    
     首先我们采用我在 第二篇文章 中所说的方式,用同步设计向导创建一个同步增量的MSF 对象,将其名称命名为: WcfSyncData.sync

     在生成相应的DataSet类( WcfDataSet.xsd )文件之后,我们通过从“文件”-->"添加"-->"新建项目"来构造一个WCF服务库,并将其命名为WcfSyncService。这样在我们的解决方案中就包含了两个项目,一个是我们的同步DEMO,一个就是新建的WCF服务项目。

      接下来我们在DEMO项目中的WcfSyncData.sync文件上双击,在弹出的“配置数据同步”窗口中的“服务器项目位置”处的下拉列表中就可以看出我们刚才新建的 WCFSyncService项,我们选择它并单击确定即可,如下图所示: 


     这样我们在看WcfSyncService项目中就会多出几个文件,它们是:
     WcfSyncData.Server.Sync
     WcfSyncData.Server.Designer.cs
     WcfSyncData.Server.SyncContract.cs
    
     其中的WcfSyncData.Server.Designer.cs内容就是以前在DEMO项目中的WcfSyncData.Designer.cs中的关于服务端SyncAdapter(数据库访问操作,SQL命令等)部分的内容,这里设计器自动将这部分代码迁移到了当前的WCF项目中,代码如下(相应的生成类内容分析参见 这篇文章 ):
    
ContractedBlock.gif Code

    
     除此之外,设计器向导还为我们自动生成了WcfSyncData.Server.SyncContract.cs文件,这个就是相应的WCF服务类文件,里面的内容定义如下:
 
public   partial   class  WcfSyncDataSyncService :  object , IWcfSyncDataSyncContract {
        
        
private  WcfSyncDataServerSyncProvider _serverSyncProvider;
        
        
public  WcfSyncDataSyncService() {
            
this ._serverSyncProvider  =   new  WcfSyncDataServerSyncProvider();
        }
        
        [System.Diagnostics.DebuggerNonUserCodeAttribute()]
         public   virtual  SyncContext ApplyChanges(SyncGroupMetadata groupMetadata, DataSet dataSet, 
                                                                  SyncSession syncSession) {
             return   this ._serverSyncProvider.ApplyChanges(groupMetadata, dataSet, syncSession);
        }
        
        [System.Diagnostics.DebuggerNonUserCodeAttribute()]
        
public   virtual  SyncContext GetChanges(SyncGroupMetadata groupMetadata, SyncSession syncSession) {
            
return   this ._serverSyncProvider.GetChanges(groupMetadata, syncSession);
        }
        
        [System.Diagnostics.DebuggerNonUserCodeAttribute()]
        
public   virtual  SyncSchema GetSchema(Collection < string >  tableNames, SyncSession syncSession) {
            
return   this ._serverSyncProvider.GetSchema(tableNames, syncSession);
        }
        
        [System.Diagnostics.DebuggerNonUserCodeAttribute()]
        
public   virtual  SyncServerInfo GetServerInfo(SyncSession syncSession) {
            
return   this ._serverSyncProvider.GetServerInfo(syncSession);
        }
    }
    
    [ServiceContractAttribute()]
    
public   interface  IWcfSyncDataSyncContract {
        
        [OperationContract()]
        SyncContext ApplyChanges(SyncGroupMetadata groupMetadata, DataSet dataSet, 
                                               SyncSession syncSession);        
        [OperationContract()]
        SyncContext GetChanges(SyncGroupMetadata groupMetadata, SyncSession syncSession);
        
        [OperationContract()]
        SyncSchema GetSchema(Collection
< string >  tableNames, SyncSession syncSession);
        
        [OperationContract()]
        SyncServerInfo GetServerInfo(SyncSession syncSession);
    }

    
     按照该文件上方提供的关于app.config配置结点信息,我们将相应的服务配置信息定义如下,首先是 services  节中:
    
< service  name ="WcfSyncService.WcfSyncDataSyncService"
              behaviorConfiguration
="WcfSyncService.WcfSyncDataSyncServiceBehavior" >
  
< host >
    
< baseAddresses >
      
< add  baseAddress  ="http://localhost:8731/Design_Time_Addresses/WcfSyncService/WcfSyncDataSyncService/" />
    
</ baseAddresses >
  
</ host >
  
< endpoint  address  =""  binding ="wsHttpBinding"  contract ="WcfSyncService.IWcfSyncDataSyncContract" >
    
< identity >
      
< dns  value ="localhost" />
    
</ identity >
  
</ endpoint >
  
< endpoint  address ="mex"  binding ="mexHttpBinding"  contract ="IMetadataExchange"   />
</ service >

 
     然后是 serviceBehaviors  节中:
    
      < behavior  name ="WcfSyncService.WcfSyncDataSyncServiceBehavior" >
          
< serviceMetadata  httpGetEnabled ="True"   />
          
< serviceDebug  includeExceptionDetailInFaults ="False"   />
     
</ behavior >
  
    
     这样配置完成后,我们将当前WCF作为启动项目并编译运行,然后将相应的服务地址链接信息拷贝出来,
然后在DEMO项目中以“添加服务引用”的方式添加进来。

     注:本DEMO的链接地址为:    
      [url]http://localhost:8731/Design_Time_Addresses/WcfSyncService/WcfSyncDataSyncService/[/url]
        
     接下来,我们只要在创建同步代理(SyncAgent)时创建相应的WCF服务(client)类实例,并将其绑定到代理类的 RemoteProvider 属性上即可,相应代码如下(位于WcfSyncForm.cs文件中):

WcfSyncDataSyncAgent syncAgent  =     new  WcfSyncDataSyncAgent( new  MSF_WinFormDemo.WcfServiceSync.WcfSyncDataSyncContractClient());
syncAgent.dnt_spacelinks.SyncDirection 
=  Microsoft.Synchronization.Data.SyncDirection.Bidirectional;
syncAgent.Synchronize(); 
// 将本地数据同步到远程数据服务器

    
     大家注意看上面的new MSF_WinFormDemo.WcfServiceSync.WcfSyncDataSyncContractClient()
即是我们在添加Web服务引用时生成的服务代理类。通过调用WcfSyncDataSyncAgent构造重载方法将代理类实例绑定到syncAgent实例的RemoteProvider上,相应的重载构造方法如下所示(位于DEMO项目中
的WcfSyncData.Designer.cs文件):

public  WcfSyncDataSyncAgent( object  remoteSyncProviderProxy) {
    
this .InitializeSyncProviders();
    
this .InitializeSyncTables();
    
this .RemoteProvider  =
          
new  Microsoft.Synchronization.Data.ServerSyncProviderProxy(remoteSyncProviderProxy);
    
this .OnInitialized();
}

        
     而接下来的其余代码就与之前我写过的那两个DEMO中的代码没有什么区别了。看来采用WCF方式进行远程数据访问很容易,主要就是将服务引用到本地,并进行同步代理 RemoteProvider 属性的相关绑定即可。  
 
     到今天为止,有关于MSF中 Sync Service for ADO.NET 的内容就要先告一段落了。从下一篇文章开始,我会介绍在MSF中如何进行 文件同步 (File Sync),对这方面感兴趣的朋友敬请留意。   
   
   

     好了,今天的内容就先到这里了:)




本文转自 daizhenjun 51CTO博客,原文链接:http://blog.51cto.com/daizhj/124354,如需转载请自行联系原作者

相关文章
|
9月前
|
C++
WCF框架-分布式联调
WCF框架-分布式联调
56 0
|
9月前
|
网络协议 网络架构 Windows
框架学习——WCF框架
框架学习——WCF框架
230 0
|
9月前
|
Windows
安装wcf框架
安装wcf框架
|
9月前
|
API 数据库
如何使用WCF框架和EF框架实现对数据库的操作
如何使用WCF框架和EF框架实现对数据库的操作
|
9月前
|
数据库 C# 数据安全/隐私保护
使用分布式框架WCF出现的BUG记录
使用分布式框架WCF出现的BUG记录
WCF基础教程(四)——数据契约实现传送自定义数据类型
WCF基础教程(四)——数据契约实现传送自定义数据类型
84 0
|
监控 NoSQL
Wcf通讯基础框架方案(一)——基本结构
由于希望使用Wcf作为公司内的通讯框架,因此基于Wcf进行了一些扩展,主要的目的有以下几个方面: 1) 希望减少客户端调用的复杂度,调用方式简化为WcfServiceLocator.Create().Add(1,2)。
770 0
|
XML 监控 数据格式
Wcf通讯基础框架方案(二)——集中配置
从这次开始在几个方面简单阐述一下实现,集中配置是这个框架很大的一个目的,首先在数据库中会有这么一些表: 其实可以看到这些表的结构,应该是和配置节点中的层次有对应的 1) Service表描述的是服务,主要保存服务行为以及服务的配置。
578 0
|
监控
Wcf通讯基础框架方案(三)——客户端
假设定义了一个服务契约: [ServiceContract(Namespace = "WcfExtension.Services.Interface")] public interface ITestService { [OperationContract] ...
689 0
|
监控 负载均衡 缓存
Wcf通讯基础框架方案(四)——横切日志
在第一篇文章中已经列出了几种日志的概览: 所有的日志都有一个最终基类,来看看这个类: [DataContract(Namespace = "WcfExtension")] [KnownType(typeof(WcfExceptionInfo))] [KnownType(t...
609 0