如何使用WCF解决一个服务器-客户端系统,该系统将共享相同的数据源,但每个客户端都有单独的实例/会话



我正在创建一个服务器客户端系统,其中服务器要托管一个服务,我试图使用。net远程作为通信手段,但遇到了问题。我在过去的项目中使用过远程处理,但我决定离开远程处理框架并切换到WCF。

系统设计如下:服务器将托管一个服务,该服务允许客户端从中检索数据。该服务还存储特定的客户端实例变量,允许它单独对待客户端(即不同的会话)。该服务意味着从数据库(紧凑数据库,即.sdf)获取这些数据,执行一些逻辑,并通过客户端可以使用的类/结构传递这些数据。

最重要的目标是:-确保每个客户端在服务器上都有自己独立的会话。-确保所有客户端都使用相同的数据源实例。

另一个目标是以二进制格式传输这些数据。

我试着阅读和理解想要单调用和单例模式的意思,但每次我读不同的材料,我越困惑,我仍然不相信如果任何一种模式能解决我的问题。

如果有谁理解我的问题,请给我解释一下使用的方法。

提前感谢。


非常感谢。我已经阅读了第一篇文章(作者@Timothy Khouri),其中介绍的特性正是我想要的。

其次,我不希望客户之间共享一些数据。如果我理解基于会话的客户机的概念,那么每个客户机在服务器机器上都有其服务器对象的副本。我想要的是这个服务器对象使用相同的linq2sql数据对象。我是否使数据对象(linq2sql对象)作为私有静态成员?或者我该怎么做。

我还想使用二进制序列化,因为我认为它更安全。我试图防止黑客可以访问共享类的情况,然后有能力创建他自己的客户端应用程序版本,因为我已经分配了一些安全问题在客户端处理。序列化方法对此有影响吗?

这正是我在过去3年里为一家公司所做的。他们的体系结构曾经是一堆ASMX soap调用,我将其更改为CONNECTED(这是您正在寻找的),使用net的会话感知体系结构。tcp (WCF)。

几年前我写了一些文章,解释了,并在文章末尾提供了一个示例下载应用程序,应该可以让您入门。

使用WCF编写客户端服务器程序

使用Net托管在IIS中的双工WCF服务。Tcp

第一个可能就是你特别要找的

我同意@Timothy Khouri

我认为Singleton和Session模式都能满足你的要求,但这都是关于系统的可扩展性,除非我们真的需要,否则我们不应该使用Singleton模式。

作为@johnny g:http://www.stackoverflow.com/questions/1756487/should-wcf-service-typically-be-singleton-or-not

"如果你不需要在消费者之间共享业务逻辑或内存,那么不要使用单例,"模型"不适合这个问题。这就像把水晶鞋硬塞到继妹的脚上!不应该让任何人看到"

所以,我想在你的情况下,你可以使用会话模式

我首先要说的是,我希望尽可能使用无状态服务,除非您确实需要有状态服务,否则我不鼓励使用无状态服务。这只是另一个潜在的问题。

话虽如此,我知道有时你确实需要一个适当的会议。这不是一个罕见的场景,也不是那么困难。

首先,为了确保每个客户端都有一个会话,您的WCF服务可以/应该使用实例上下文模式进行装饰,如下所示:
[ServiceBehavior(InstanceContextMode = InstanceContextMode.PerSession)]
public class MyService : IMyService
{ 

这意味着当客户端打开一个通道时,他们将实例化一个服务实例;如果他们保留了这个通道,实例将被持久化,并且他们将重用它。

要使用二进制传输,您应该简单地配置您的端点使用net.tcp绑定-

<service name="MyService">
    <endpoint binding="netTcpBinding" contract="IMyService ... />

具体的配置实现可能会让WCF新手感到沮丧-如果没有成功,请使用Visual Studio WCF配置工具。

最新更新