您可以将您上次在客户端更新的日期时间作为请求发送到您的 wcf 服务。但是在服务器端,您会获取Persons
在该日期时间之后更新/添加的所有内容并将其作为结果返回。这样,您将仅从Person
服务器端获得修改/添加的 s。
因此,将 lastUpdate 列添加到您的实体Person
中。
编辑 1
如果您想服务器更新客户端中的信息而不是客户端从服务器请求消息。
你可以使用它的工作方式Web Programming
。
(1)client-side
询问server-side
- “嘿,我的最后一次更新是在 2013 年 10 月 2 日 20:00 ”,然后服务器查看数据库 - “是 2013 年 2 月 20 日 20:00 之后的新闻吗?” 如果是:
a) 将消息返回给客户端
如果数据库中没有消息:
b) 他不返回 null,但他执行 Thread.Sleep(somevalue)。他睡着了,然后重复对 db 的查询,并询问“db 中有消息”。所以这一切都在重复,直到数据库中的消息出现。在 db 中出现消息后,他返回List<data>
dateTime 之后更新的消息。在那个客户得到数据后,他回到了这一点 - (1)。
所以你不会向服务器发出很多请求,而是只发出一个请求并等待来自服务器的消息。
注意2点:
1)如果客户端等待太久,服务器端会抛出异常(实际上不记得错误代码,但现在不重要了),所以你必须捕获这个异常client-side
并发出新的请求server-side
。此外,您必须配置server-side
只要您可以等待时间,以尽量减少来自客户端的请求量。
2)您必须data-updater
在新线程中运行它,而不是在应用程序运行的主线程中。
从代码中它的外观(它可能不起作用,我只是想向您展示逻辑):
服务器端:
public List<SomeData> Updater(DateTime clientSideLastUpdate)
{
List<SomeData> news = new List<SomeData>();
while(true)
{
List<SomeData> news = dbContext.SomeData.Where(e=>e.UpdateDateTime > clientSideLastUpdate).ToList();
if(news.Count()>0)
{
return news;
}
}
}
客户端:
public static void Updater()
{
try
{
var news = someServiceReference.Updater(DateTime clientSideLastUpdate);
RenewDataInForms(news);
Updater();
}
catch(ServerDiesOrWhatElseExcepption)
{
Updater()
}
}
在代码的某处,您在新线程中运行此更新程序
Thread updaterThread = new Thread(Updater());
updaterThread.Start();
编辑 2
如果您想通过一个请求更新所有实体,但不仅SomeData
如此,您必须添加 Dto 对象,该对象将包含您想要更新的每个实体的列表。将server-side
完成并返回此 Dto 对象。
希望能帮助到你。