问题是关于类中的静态数据。
如果那是一个服务类,那么我认为实例化模式很重要。但是如果我有另一个独立的单例类会发生什么?
我可以在那里创建一个可用于所有每次通话的对象吗?IIS 是否永远在内存中拥有该 dll,以便单例将一直在内存中?
如何使某些对象可用于所有 WCF 客户端调用?是否可以在 IIS 中执行此操作,还是应该在 Windows 服务中托管 WCF 服务?
将根据您提供的简短上下文提供一些提示
如果您有一个静态类,则只要您有权访问相同的 WCF 代理,该状态就会保持不变。主机(IIS 或 Windows 服务)无关紧要。
如果您想跨客户端请求维护“全局静态变量”,为什么不将它们存储在存储库(文件/数据库/等)中?
如果您想保留每个客户端请求的状态,您可以尝试查看“Durable WCF services”(相关线程)。我之前使用过它 - 所以它确实可以工作,前提是您的场景需要类似会话的行为并且知道性能成本。
希望这可以帮助。
在我的本地 IIS 中检查了问题。
这是我的代码。
[ServiceBehavior(InstanceContextMode = InstanceContextMode.PerCall)]
public class Service : IService
{
public static int _counter = 0;
public string GetData()
{
_counter++;
return _counter.ToString();
}
}
使用默认的 IIS 配置,每个应用程序拉动都会运行一个进程,并且此代码按预期工作。结果在每次服务调用中递增。
这是有道理的,因为InstanceContextMode
不管理线程。它只控制生命InstanceContext
周期。
知道我们仍然不能考虑将静态变量用于可变数据作为最佳实践。IIS 可以配置为“Web Garden”。该配置意味着每个应用程序池允许多个工作进程,并且每个进程都将拥有自己的静态变量副本。
http://www.iis.net/ConfigReference/system.applicationHost/applicationPools
如何使某些对象可用于所有 WCF 客户端调用?是否可以在 IIS 中执行此操作,还是应该在 Windows 服务中托管 WCF 服务?
对象应该存储在持久性存储中,例如数据库或分布式缓存。IIS 仍然是一个很好的服务宿主,它提供了 Windows 服务可以做的一切以及更多。