C/S架构,winform如何获取windows服务中提供的数据?
详细描述:windows服务定期从WCF服务上获取数据,并使用某种方式将这些获取的数据“缓存”起来,响应winform客户端访问请求。
winform客户端原先从WCF上获取数据,但由于数据量大从WCF服务上获取数据耗费时间较长,而且对于一些基础数据,并无可能修改。现在想通过windows服务的方式在后台运行预先将数据从WCF服务上获取过来并使用某种方式(现在打算采用静态变量方式)“缓存”起来,这样winform客户端每次启动时就可以直接从本地的windows服务上快速获取数据,提高响应速度。
这样的windows服务如何编写?
没必要吧,把你的打算用 Windows 服务要实现的功能直接放在 Winform 中就行,除非你需要多个进程共享数据。
题主的应用环境应该是这样的。
1、数据库或是WCF服务在远程,或叫云端。通常可能最多是10M光纤,低一些的应该也有可能是512M ADSL。
2、内部有N台客户端,希望有一台服务端,在本地(100M\1000M局域网)
3、这样等于本地缓存了一部分数据。
@爱编程的大叔: 你的理解能力真强
@爱编程的大叔: 差不多就是这样的情况。
测试WCF服务端:在服务端首次启动并开始响应客户端请求时,在数据为10W级别的时候的第一次时获取时间大概在220秒-250秒左右。这其中经过了2次数据转换,1次是entity=>dto,1次是dto=>viewmodel,2次都采用手动映射,以前采用的AutoMapper方式更慢。 WCF服务端数据采用静态变量缓存。客户端的后续请求并获取数据时间大概在7-8秒左右。
如果每台客户端都在本地有一个服务将这些数据缓存起来,速度就快了。
没错,我就是这想法。
@山上山夫: “每台客户端都在本地有一个服务” —— 我的理解是客户端和服务在同一台机器,而人家告诉你的是“2、内部有N台客户端,希望有一台服务端,在本地(100M\1000M局域网)”,翻译过来就是客户端和服务不在同一台机器。你到底说的是哪个?
@Launcher: 抱歉,没注意看清。
WCF服务端的部署可能在本地局域网,也可能是在广域网上吧。
客户端本来是直接来访问这个WCF服务的,我的想法就是因为获取数据的时间太长了(比如WCF服务第2次响应请求也要7-8秒),我的想法就是将一些没有同步要求的数据放置在本地,这样客户端就不用去到WCF服务器上再次请求数据了,这样就可以快速响应客户端的请求了。
如果按照这个思路走,那么就应该是每个客户端都有一个本地的windows服务之类的服务,能将数据“缓存”起来。
不知我这样描述你有没有理解了?谢谢
@Launcher:
也就是说这个windows服务程序去访问WCF服务提供的数据,并将数据拿到本地“缓存”起来,然后客户端在这个服务处拿到数据,因为是本地,貌似会快很多吧。
对,就是这样的要求。
@山上山夫: 没必要吧,把你的打算用 Windows 服务要实现的功能直接放在 Winform 中就行,除非你需要多个进程共享数据。
那我还就这个回答,你没必要建立一个 Windows 服务,因为你是在同一台机器,又不需要跟其它进程共享数据通道,所以直接写到 Winform 程序中。
@Launcher:
也许吧。
我已经尝试了写了一个windows服务,但得到的结果和直接用winform调用WCF服务差不多,通过调试发现windows服务中设置的静态变量每次都会初始化,这样在一个会话中(是这样吗?也就是说每次调用windows服务是不同的session?)获取到的数据就不能在下次的会话中共享。
由于是第一次写windows服务,不太清楚windows服务中能否共享session。
谢谢你。
@山上山夫: 你是不是认为同样调用 WCF 的代码,在 Windows 服务中运行就会比在 Winform 中快?如果你觉得是的话,那你就等别人给答案吧!
这是打算实现一个应用服务器的啊。
这样的项目如果低于百万基本就没有任何意义了。
从你的描述中可以看出来你的知识面太窄,建议有空多看看书,以及多看看框架理论的博客。
没那么高大上,很实在且简单的想法而已,看看能不能优化下而已吧。
@山上山夫: 你的用户这么多,系统起码也得有几个亿了,失敬失敬。
可以考虑使用数据库缓存数据。比如sqlite。
考虑过将数据用本地数据库方式缓存起来,比如:sqlce,sqlite。然后客户端读本地数据库,但如果本地windows服务能提供这样的缓存可能会更好吧?
@山上山夫: 知识有限,我不知道如何去拿Windows服务缓存的数据。。
@幻天芒: 谢谢你,我也是瞎折腾吧。
@山上山夫: 没有时限的时候,可以瞎折腾,这是乐趣。。如果资源有限的话,就需要快速出结果。