Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/wcf/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何使用WCF解决共享相同数据源但每个客户端都有单独实例/会话的服务器-客户端系统_C#_Wcf - Fatal编程技术网

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

C# 如何使用WCF解决共享相同数据源但每个客户端都有单独实例/会话的服务器-客户端系统,c#,wcf,C#,Wcf,我正在创建一个服务器-客户机系统,其中服务器将承载一个服务,我尝试使用.net远程处理作为通信手段,但遇到了一些问题。我在过去的项目中使用过远程处理,但决定离开远程处理框架,转而使用WCF 系统设计如下: 服务器将承载一个允许客户端从中检索数据的服务。该服务还存储特定的客户端实例变量,这些变量将允许它单独处理客户端(即不同的会话)。该服务旨在从数据库(compact database,即sdf)获取该数据,执行一些逻辑,并通过客户机可以使用的类/结构传递该数据 最重要的目标是: -确保每个客户端

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

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

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

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

我试图阅读并理解Wast single call和singleton mode的含义,但每次我阅读不同的材料时,我越是感到困惑,我仍然不相信这两种模式是否能解决我的问题

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

提前谢谢


很多。我已经阅读了第一篇文章(作者@Timothy Khouri),介绍的功能正是我想要的

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

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

这正是我在过去3年中为一家公司所做的工作。他们的体系结构过去是一堆ASMX soap调用,我将其更改为一个连接的(这就是您正在寻找的),使用net.tcp(WCF)的会话感知体系结构

几年前我写了一些文章解释is,文章结尾有一个示例下载应用程序,应该可以让你开始


第一个可能是你特别想要的。

我同意@Timothy Khouri的观点

我认为Singleton和Session模式都能满足您的要求,但这都是关于系统可伸缩性的,我们不应该使用Singleton模式,除非我们真的需要它

作为@johnny g:

“如果你不需要在消费者之间共享业务逻辑或内存,那么就不要使用单例,因为“模型”不适合这个问题。这就像把一只玻璃拖鞋压在继母的脚上一样!任何人都不应该看到这一点。”


因此,我认为在您的情况下,您可以使用会话模式。首先,我想说,只要有可能,我更喜欢无状态服务,除非您确实需要有状态服务,否则我不鼓励这样做。这只是另一个潜在的问题

话虽如此,我知道有时候你确实需要一次适当的治疗。这种情况并不罕见,也没有那么困难

首先,为了确保每个客户端都有会话,您的WCF服务可以/应该使用实例上下文模式进行修饰,如下所示:

[ServiceBehavior(InstanceContextMode = InstanceContextMode.PerSession)]
public class MyService : IMyService
{ 
这意味着当客户机打开一个通道时,他们将实例化一个服务实例;如果他们保留该通道,实例将持续存在并重用它

要使用二进制传输,您只需将端点配置为使用
net.tcp
binding-

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


对不起我有理由特别强调这些要点。。。(基本上是为那些在谷歌上搜索网页的人准备的,他们只需花3秒钟)。