【发布时间】:2011-09-26 19:55:29
【问题描述】:
我的 ASP .Net C# Web 应用程序允许其用户使用 FTP 从他们在我的服务器上的帐户向任何远程服务器发送文件。我已经实现了一个 WCF 服务来做到这一点。该服务为每个用户实例化一个类,该类生成一个在服务器上执行 FTP 操作的工作线程。客户端向服务发送命令,服务找到分配给客户端的工作线程并启动 FTP 命令。然后客户端每两秒轮询一次服务以获取 FTP 操作的状态。当客户端发送“断开连接”命令时,执行 FTP 操作的类和工作线程被销毁。
FTP 工作线程需要在客户端查询之间持续存在,因为 FTP 处理可能需要很长时间。所以,我需要一种方法让客户端在对服务的调用之间始终获得相同的 FTP 类实例。我将此服务实现为单例,因此:
[ServiceBehavior(InstanceContextMode = InstanceContextMode.Single)]
public class UserFtpService : IUserFtpService
{
private SortedDictionary<string, UserFTPConnection> _clients = new SortedDictionary<string, UserFTPConnection>();
...
}
其中“UserFTPConnection”是包含工作线程的类,用户的帐户名用于字典中的索引。
我的问题是:在我读过的有关 WCF 的书中,单例实例被称为“可伸缩性的敌人”。我明白为什么会这样。除了使用单例之外,有没有更好的方法来确保客户端在对 WCF 服务的查询之间获得相同的 UserFTPConnection 实例?
【问题讨论】: