我正在创建一个服务器客户端系统,其中服务器将托管服务,我尝试使用.net远程处理作为通信手段但遇到了问题。我在过去的项目中使用了远程处理,但决定离开远程处理框架并切换到WCF。
系统设计如下: 服务器将托管一项服务,允许客户端从中检索数据。该服务还存储特定的客户端实例变量,允许它单独处理客户端(即不同的会话)。该服务旨在从数据库(压缩数据库,即.sdf)中获取此数据,执行一些逻辑,并通过客户端可以使用的类/结构传递此数据。
最重要的目标是: - 确保每个客户端在服务器上都有自己独立的会话。 - 确保使用相同的数据源实例为所有客户端提供服务。
另一个目标是以二进制格式传输此数据。
我试过阅读并理解想要单调和单身模式的意思,但每次我阅读不同的材料时,我就越困惑,我仍然不相信这两种模式是否能解决我的问题。
如果有人了解我的问题,请向我解释使用方法。
提前致谢。
Thanx很多。我已经阅读了第一篇文章(由@Timothy Khouri撰写),所介绍的功能正是我所寻找的。
其次, 我不希望客户端之间共享一些数据。如果我理解基于会话的客户端的概念,则每个客户端在服务器计算机上都有其服务器对象的副本。我想要的是这个服务器对象使用相同的linq2sql数据对象。 我是否将数据对象(linq2sql对象)作为私有静态成员?或者我应该怎么做。
我也想使用二进制序列化,因为我觉得它更安全。我试图阻止黑客可以访问共享类,然后能够创建自己的客户端应用程序版本的情况,因为我已经分配了一些安全问题要在客户端处理。 序列化方法是否可以对此产生影响?
答案 0 :(得分:1)
这正是我为过去3年工作的公司所做的。他们的体系结构曾经是一堆ASMX soap调用,我将其更改为 CONNECTED (这是您正在寻找的),使用net.tcp(WCF)的会话感知架构。 / p>
几年前我写了一些文章,解释的是并且在文章的末尾有一个样本下载应用程序,这应该可以帮助你开始。
Client Server Programming with WCF
Duplex WCF Services Hosted in IIS Using Net.Tcp
第一个可能就是你正在寻找的东西。
答案 1 :(得分:0)
我同意@Timothy Khouri
我认为Singelton和Session模式都能满足您的要求,但这完全取决于系统的可扩展性,我们不应该使用Singleton模式,除非我们确实需要它。
作为@johnny g: http://www.stackoverflow.com/questions/1756487/should-wcf-service-typically-be-singleton-or-not
“如果你不需要在消费者之间分享商业逻辑或记忆,那么不要使用单身人士,”模特“不适合这个问题。这就像在一个姐姐的脚上强迫一个玻璃拖鞋!而且没有人们应该看到“
所以,我认为在你的情况下,你可以使用会话模式
答案 2 :(得分:0)
我首先要说的是,我希望尽可能地选择无国籍服务,除非你真的需要有状态的服务,否则我会劝阻它。这只是另一个潜在的问题。
说过我知道有时你确实需要一个合适的会话。这不是一个不常见的情况,并不是那么困难。
首先,为确保每个客户端的会话,您的WCF服务可以/应该使用实例上下文模式进行修饰,如下所示:
[ServiceBehavior(InstanceContextMode = InstanceContextMode.PerSession)]
public class MyService : IMyService
{
这意味着当客户端打开一个频道时,他们将实例化一个服务实例;如果他们保留了该实例将保留的那个频道,他们将重复使用它。
要使用二进制传输,您只需将端点配置为使用net.tcp
绑定 -
<service name="MyService">
<endpoint binding="netTcpBinding" contract="IMyService ... />
特定配置实现对于WCF新手来说可能会令人沮丧 - 如果您没有取得任何成功,请使用Visual Studio WCF配置工具。