IIS 中承载的 WCF 服务的生命周期

本文关键字:服务 生命 周期 WCF IIS | 更新日期: 2023-09-27 18:37:16

问题是关于类中的静态数据。

如果这是一个服务类,那么我认为实例化模式很重要。但是,如果我有另一个独立的单例类,会发生什么情况?

我可以在那里创建一个可用于所有每次调用调用的对象吗?IIS 是否永远在内存中具有该 dll,以便单例将始终在内存中?

如何使某些对象可用于所有 WCF 客户端调用?是否可以在 IIS 中执行此操作,或者我应该在 Windows 服务中承载 WCF 服务?

IIS 中承载的 WCF 服务的生命周期

检查了我本地 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 中执行此操作,或者我应该在 视窗服务?

对象应存储在持久存储中,如数据库或分布式缓存。IIS仍然是一个伟大的服务主机,它提供了Windows服务可以做的一切以及更多。

将根据您提供的简短上下文提供一些提示

  • 如果您有静态类,则只要您有权访问同一 WCF 代理,就会保持该状态。主机(IIS 或 Windows 服务)无关紧要。

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

  • 如果要保留每个客户端请求的状态,可以尝试查看"持久 WCF 服务"(相关线程)。我之前用过它 - 所以如果你的方案需要类似会话的行为并且知道性能成本,它就可以工作。

希望这有帮助。