IIS中托管WCF服务的生命周期

5
这个问题涉及类中的静态数据。
如果这是一个服务类,那么我认为实例化模式很重要。但是如果我有另一个独立的单例类呢?
我可以在那里创建一个对象,使其对所有的 per-call 调用都可用吗?IIS 是否永久地将该 dll 保存在内存中,以便单例始终在内存中?
如何使某个对象对所有 WCF 客户端调用都可用?我是否可以在 IIS 中实现这一点,还是应该将 WCF 服务托管到 Windows 服务中?
2个回答

2
根据您提供的简短上下文,将会提供一些提示:
  • 如果您有一个静态类,则只要您可以访问相同的WCF代理,状态就会保持不变。主机(IIS或Windows服务)无关紧要。

  • 如果您想要在客户端请求之间维护“全局静态变量”,为什么不将它们存储在存储库中(文件/数据库等)?

  • 如果您想要为每个客户端请求保留状态,则可以尝试使用“可持久性WCF服务”(相关线程)。我之前使用过它-因此它确实有效,前提是您的场景需要会话类似的行为并且知道性能成本。

希望这可以帮助到您。

我不明白第一点(你具体指的是什么:相同的WCF代理?)第二点,因为我想从数据库中加载一些数据并将其提供给客户端(速度很重要)。另一方面,据我所知,耐用服务使用cookie来存储客户端的会话数据。因此,在Windows服务中托管WCF是正确的选择吗? - John
1
@John - 在第一点中,我所说的“WCF代理”是指在客户端创建的用于访问服务的对象。因此,假设您使用一个WCF代理来进行多个服务调用,则静态类(在服务器端)将保持不变。除非服务调用相关,否则我不建议这样做。关于您的第二个问题,我喜欢使用Windows服务来维护全局变量的想法。虽然以前没有使用过,但可以尝试一下。 - Channs

2
在我的本地 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中实现还是应该将WCF服务托管在Windows服务中?
对象应存储在持久性存储中,如数据库或分布式缓存中。 IIS仍然是服务的一个很好的托管者,它提供了Windows服务所能做的一切,而且更多。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接