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)发生了什么?也许如果我们能看到,我们可以帮助识别问题。
在任何情况下,只将方法设置为静态并不意味着它将缓存第一次调用的结果。
- 我编辑了文章以更准确地反映这是对方法的静态调用,而不是设置属性。我们最终正在设置一个属性,但我们已经将问题与此调用隔离开来。我只是不确定由于"静态"限定符的原因,是否在第一次调用之后保留了调用的结果。据我们所知,在IIS之外调用相同的方法会一致地返回所需的值。谢谢你帮我澄清这一点。
- 只是为了强调乔对应用程序池回收的评论。您出现此问题的一个原因是,一段时间后,IIS将回收应用程序池,并在该过程中关闭您的应用程序。
- 方法的返回值不会在调用该方法时被缓存,它将被执行并返回一个值。现在,有一件事可以解决它,我们存储一个变量的值。一旦Inter开始工作,在我面前有一台PC,我会编辑我的答案,向你展示我在说什么。
- licenser.featureEnabled(此功能)是一个支持库。此dll由同一应用程序池中的网站和Web服务(同一个dll,但每个dll的bin目录中都有单独的副本)使用。当这种情况存在时,我们可以从Web服务看到相同的行为。重新启动IIS可以解决这两种情况。我认为我们需要按照Joe的建议进入许可库。内存中必须有某个内容在IIS重新启动或应用程序池回收时刷新。
- @Treltub听起来像是发生了什么。告诉我怎么回事
- 另外,要明确一点,静态只意味着它在每个AppDomain的基础上是静态的,因此,如果在同一应用程序池中运行多个ASP.NET应用程序,则该类将有多个实例,因此每个AppPool的唯一性不是真的。此外,AppDomins在完全AppPool回收以外的情况下被回收,例如,如果修改web.config文件,它将创建一个新的AppDomain,因此将存在一个新的静态文件,或者如果更改app_code目录,或在/bin目录中添加一个新的dll,等等。
- 好叫出来。谢谢@carlosag