博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
微软同步框架入门之五--使用WCF同步远程数据
阅读量:6629 次
发布时间:2019-06-25

本文共 4746 字,大约阅读时间需要 15 分钟。

  在之前介绍的两个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,如需转载请自行联系原作者

你可能感兴趣的文章
动态测试
查看>>
Python学习笔记<list和tuple>
查看>>
hadoop-hdfs-整合ZK-联邦机制
查看>>
学术休假-破译密码
查看>>
IE浏览器表格内外边框不显示问题
查看>>
克利夫兰将保留詹姆斯巨幅海报 它已成总冠军象征
查看>>
PHP微信模板消息发送
查看>>
14.抽象类
查看>>
vue-pos : 子组件与子组件通讯
查看>>
停止冒泡
查看>>
Guid的生成和数据修整(去除空格和小写字符)
查看>>
3381: [Usaco2004 Open]Cave Cows 2 洞穴里的牛之二
查看>>
关于NSMutableDictionary setValue:value forKey:key 以及 setobject:value forkey:key 的理解
查看>>
ORACLE 定时执行存储过程
查看>>
背包问题总结
查看>>
objects classes and metaclasses in Objective-C
查看>>
自行车需求预测
查看>>
状态机
查看>>
Linux学习第十一篇之压缩解压命令gzip、gunzip、tar、zip、unzip、bzip2、bunzip2
查看>>
php开发之LNMP环境搭建(PHP7+phalcon3)
查看>>