Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/wcf/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
适用于n层体系结构的良好.Net同步框架_.net_Wcf_Entity Framework_Synchronization_N Tier Architecture - Fatal编程技术网

适用于n层体系结构的良好.Net同步框架

适用于n层体系结构的良好.Net同步框架,.net,wcf,entity-framework,synchronization,n-tier-architecture,.net,Wcf,Entity Framework,Synchronization,N Tier Architecture,对于一个项目,我需要更改服务器和客户端之间的通信 实际上,它是一个WCF服务,托管在控制台应用程序中,将整个表内容发送到客户端,客户端用新内容替换其所有本地缓存 客户机应用程序可以脱机工作(我们有一个区域设置缓存,它通过磁盘上的序列化而持久化,我们还有一个事务列表,它存储连接后必须发送到服务器的所有更改) 问题是,这种同步现在将发生在GSM连接上,发送整个表的内容实在是太重了 因此,要么我自己实现所有这些(设置修改日期、存储上次同步日期、仅获取更新字段、更新缓存),要么我可以找到一种标准方法来实

对于一个项目,我需要更改服务器和客户端之间的通信

实际上,它是一个WCF服务,托管在控制台应用程序中,将整个表内容发送到客户端,客户端用新内容替换其所有本地缓存

客户机应用程序可以脱机工作(我们有一个区域设置缓存,它通过磁盘上的序列化而持久化,我们还有一个事务列表,它存储连接后必须发送到服务器的所有更改)

问题是,这种同步现在将发生在GSM连接上,发送整个表的内容实在是太重了

因此,要么我自己实现所有这些(设置修改日期、存储上次同步日期、仅获取更新字段、更新缓存),要么我可以找到一种标准方法来实现。我认为一个专门的图书馆会做得更好,因为他们已经考虑了很多我当然没有考虑过的场景

同步层的耦合度很低,所以改变它的工作方式并不是什么大问题

我的项目要求是:

  • 应该有增量同步
  • 可以将更改推送到服务器
  • 离线访问/存储信息
  • 进行完全重新同步的可能性(损坏的缓存或新计算机)
  • 服务器端的数据提供程序是实体框架
  • 我需要重新使用当前的自定义身份验证
  • 好处:某些类型有一个特殊的同步(例如,我有一个包含小文件的数据库,但在客户端,文件必须直接放在文件夹中)
我环顾了一下周围,看看有什么存在

我发现了一些关于Microsoft Sync Framework的东西,但它似乎非常面向ADO.Net,我不确定它是否可以从实体服务获取数据并将其放入序列化缓存中

因此:


你能建议我一些框架或库来做这项工作吗?或者您认为关于我的需求,我更应该自己实现这一点吗?

取决于您可以或愿意部署和公开您可以使用的服务器的方式

在您担心应用程序时,复制可以解决所有繁琐的问题

可以考虑安装SQL Express并使用合并复制。

编辑 管理要复制和复制的数据。显然,微软没有为SQL Express提供引导程序,你看过这个吗


过滤也没那么难,请参见:过去,我在一个类似的N层偶尔连接的客户端上使用了Microsoft Sync Framework,效果不错。自从我上次使用它以来,它一直在发展,但下面是我如何看到它满足您的要求

WCF

适用于WCF,这是我们使用它的方式。()

应具有增量同步

同步服务在这方面做得很好,但您可能需要向同步表中添加时间戳。您的客户机数据库(在我的示例中是SQL Server CE数据库)保存上次同步时使用的最后一个时间戳,然后它将使用该时间戳获取在下次同步期间随后更改的所有内容

可以将更改推送到服务器

我们又这样做了。服务器上有很多钩子提供自定义逻辑来验证数据

离线访问/存储信息

在完全断开连接的情况下工作正常(前提是用户已经首先同步了数据)。看

完全重新同步的可能性(损坏的缓存或新计算机)

它是保存所有同步信息的客户端数据库(如果需要,可以将有关客户端已同步的内容的知识放入服务器)。如果删除本地数据库,则客户端将执行完全同步

服务器端的数据提供程序是实体框架

这不是我使用它的方式,但是同步提供者是完全可定制的。我们打算做一个NHibernate,但是问问自己为什么要这样做。开箱即用同步服务将允许您使用存储过程或直接表查询推拉数据。这很容易设置,因为您可能会使用大量数据,所以运行速度非常快,而且跨WCF边界同步数据也很简单(尽管我们确实从xml格式化程序切换到二进制格式化程序以获得更好的性能)

我们所发现的只是因为我们在服务器上使用了实体,它们在客户端上不一定有意义,因此我们在客户端上有了一组全新的实体。这也意味着我们正在剥离存储过程中客户端不需要的数据。同样,这非常简单,您不需要使用ADO.net弄脏它。一旦数据在客户机上,我们就使用NHibernate读取和写入本地数据库

我需要重新使用当前的自定义身份验证

如果您是指WCF自定义身份验证,那么是的,因为我们有自己的WCF自定义安全令牌,它工作正常,没有任何影响

好处:某些类型具有特殊的同步功能(例如,我有一个包含小文件的数据库,但在客户端,文件必须直接放在文件夹中)

简短回答我不知道,因为他们是新框架中的文件同步提供程序,我没有使用过,但您还有两个其他选项

  • 在客户端上的同步过程中,您实际上可以连接到将数据放入表中的点,这样您就有机会提取二进制数据并将其写入文件系统而不是数据库

  • 从同步中排除文件二进制数据,并在同步后使用另一个进程向下拉取此数据。我们这样做是因为我们要下载的包相当大,所以我们使用初始同步来下载“元数据”
    [OperationContract()]
    SyncContext GetChanges(SyncGroupMetadata groupMetadata, SyncSession syncSession);
    
    [OperationContract()]
    SyncSchema GetSchema(Collection<string> tableNames, SyncSession syncSession);
    
    [OperationContract()]
    SyncServerInfo GetServerInfo(SyncSession syncSession);