如何使用WCF来解决将共享相同数据源但将为每个客户端分别具有实例/会话的服务器 - 客户端系统

时间:2011-08-30 00:47:11

标签: c# wcf

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

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

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

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

我试过阅读并理解想要单调和单身模式的意思,但每次我阅读不同的材料时,我就越困惑,我仍然不相信这两种模式是否能解决我的问题。

如果有人了解我的问题,请向我解释使用方法。

提前致谢。


Thanx很多。我已经阅读了第一篇文章(由@Timothy Khouri撰写),所介绍的功能正是我所寻找的。

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

我也想使用二进制序列化,因为我觉得它更安全。我试图阻止黑客可以访问共享类,然后能够创建自己的客户端应用程序版本的情况,因为我已经分配了一些安全问题要在客户端处理。 序列化方法是否可以对此产生影响?

3 个答案:

答案 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配置工具。