C# 单例vs PerSession vs PerCall状态管理

C# 单例vs PerSession vs PerCall状态管理,c#,wcf,state,C#,Wcf,State,我有一个WCF服务正在传输大文件 目前,我正在使用带有类中实例列表的Singleton服务来保存状态,并响应客户端的传输进度请求,等等 实例化类本身在需要时为每次传输处理新线程 添加传输请求和请求进度的客户端可以同时断开连接,并随机重新连接请求 另外,几个不同的客户端可能希望请求正在进行的所有传输的进度 尽管一切都很顺利,但我相信有更好的方法可以做到这一点 以某种方式在SQL中存储状态? 像我当前正在做的那样存储状态,并以某种方式重新连接到同一个实例?那么如何从所有实例中获取数据呢 我希望您能理

我有一个WCF服务正在传输大文件

目前,我正在使用带有类中实例列表的Singleton服务来保存状态,并响应客户端的传输进度请求,等等

实例化类本身在需要时为每次传输处理新线程

添加传输请求和请求进度的客户端可以同时断开连接,并随机重新连接请求

另外,几个不同的客户端可能希望请求正在进行的所有传输的进度

尽管一切都很顺利,但我相信有更好的方法可以做到这一点

以某种方式在SQL中存储状态? 像我当前正在做的那样存储状态,并以某种方式重新连接到同一个实例?那么如何从所有实例中获取数据呢


我希望您能理解我的冗长问题:)

如果您的WCF服务只有一个实例,您的解决方案将非常有效

当您使用loadballancing实例化多个实例时,该方法将不起作用。
在这种情况下,您需要保持状态是所有实例的公共位置。它可以是SQL、状态服务器、另一个可以保持状态的WCF服务,等等

更新
您需要为每个文件传输任务生成id。然后Singletone可以将id与进行传输的实例关联起来(我们称之为Executor)。
当客户端希望获得进度或取消传输时,它会请求单音并提供任务id。
Singletone应该使用任务id来解析实际执行者和forvard客户端对正确执行者的请求


因此,您将能够根据需要实例化尽可能多的执行者。客户机不应该担心哪个执行者处理文件。客户应该知道的是任务id。

是。目前是单实例。但是使用SQL的多实例服务。如何连接回正确的实例以获取信息?例如,中止传输请求。如何从所有正在运行的实例中获取信息?我连接到每个实例或从实例本身实现信息查询,该查询根据存储在SQL中的数据返回关于所有其他实例的信息?因此,基本上,通过这种方式,我将有一个作为“执行者”之间网关的单例?这是一种方法,是的。但是,在PerCall模式下托管的单个WCF服务也会达到同样的效果?每次调用都会得到新实例,需要时会被重定向?这样做有什么好处?P.S当前所有my线程中都有用于id-ing的只读GUID。PerCall和PerSession模式都不提供根据任务id将客户端请求转发给正确执行者的功能:)。因此,您需要手动forvard请求。单模是这里的最佳选择。这种情况下的可伸缩性将通过按需动态实例化执行器来确保。