ASP.NET和IIS应用程序池中的静态类方法持久性

Static class method persistence in ASP.NET and IIS app pool

在ASP.NET Web应用程序的上下文中使用时,当IIS应用程序启动时,是否只调用一次此静态类方法?

1
2
3
4
5
6
7
public static class Licensing
{
    public static bool IsThisLicensed(ThisFeature)
    {
       return Licenser.FeatureEnabled(ThisFeature);
    }
}

我们有一种情况,类似于此的调用在一段时间内返回true(应该如此),然后返回false,直到重新启动IIS。重新启动IIS后,该值再次返回true。也就是说,这种行为的时机是不可预测的。

如果不重新启动IIS或回收应用程序池,我们就无法理解值为什么会更改。我们的期望是在应用程序启动时调用一次此静态方法,并且在应用程序重新启动之前,该值将在应用程序范围内可用。

我认为这与之前的文章类似:但在本例中,我们使用的是对方法的调用,而不是对属性的调用。


您发布的示例是一个方法(而不是属性),除非在Licenser.FeatureEnabled(ThisFeature)中发生了什么,否则您不会设置任何内容。仅返回数据。

在任何情况下,如果您有一个静态属性,而该属性实际上又在其他静态变量中设置了一个值,那么它应该是活动的,直到应用程序池循环使用为止。听起来你的电话可能有问题。

编辑以处理评论:

仅仅因为方法是静态的,并不意味着它只会被调用一次。静态意味着每个应用程序域只存在该方法的一个实例。所以,只要调用方法,代码就会被执行。

如果在IIS第一次启动时返回true,并且在一段时间后返回false,那么您的逻辑中一定有一个bug。也许你正在失去状态?也许你依赖于一些可用的东西,当应用程序池循环使用时,这个值会丢失?Licenser.FeatureEnabled(ThisFeature)发生了什么?也许如果我们能看到,我们可以帮助识别问题。

在任何情况下,只将方法设置为静态并不意味着它将缓存第一次调用的结果。