c# – 在单独的DLL中具有逻辑的.NET Web项目正在卸载

我有一个.NET Web应用程序,它为许多非UI代码使用单独的类库.在此库中是一个静态类,用于站点范围的配置信息.它在Application_Start事件期间初始化.

我有一个问题,这个关键的静态对象似乎间歇性地失去了它的状态 – 我假设因为某些原因导致DLL被卸载.它可能不会发生几天,或者可能每天发生几次.但是,如果没有重新启动应用程序,则会发生这种情况,因此结果是在Application_Start期间初始化的所有数据都将丢失,从而导致各种问题.回收应用程序池或以其他方式重新启动应用程序会修复它.

在我弄清楚发生了什么后,我更改了代码,以便类库中的配置对象使用静态构造函数初始化自身,而不是在应用程序启动阶段.这引入了一些其他不值得进入的复杂性,但我可以使它工作 – 我只是认为它是一个糟糕的架构,不应该是必要的.

我是否能够依赖于在Application_Start期间加载的外部DLL中的静态对象,以便在应用程序的生命周期内保持其状态?显然我不能 – 我不知道为什么 – 但我想知道我是否应该寻找DLL正在卸载的原因,或者只是接受它可以并且永远不会编写依赖于静态对象之外的代码主应用程序DLL保持其值.

这就是Application_Start的样子.

Application_Start() {

    // asp.net routing
    ConfigureRoutes();

    // LF is the static config object in an outside dll
    // the LFFactory object implements session & database stuff that's context-specific
    // (e.g. this is initialized with a different implementation when testing).

    LF.Initialize(new SiteEnvironment.Web.LFFactory());

    // add custom view engine...
    ViewEngines.Engines.Clear();
    ... blah blah 

}

解决方法

不确定它是否解决了您的问题,但在Web应用程序中使用静态类特别困难.使用静态方法的类(基于静态或基于实例)很好,但静态属性和字段将导致破坏.您的数据将在IIS中的线程之间共享,数据将以看似随机的顺序被覆盖.

如果您尝试共享静态数据,请将该数据放在web.config中或将其缓存在服务器上.如果数据是读/写,则将其放在基于实例的对象中.

相关文章

目录简介使用JS互操作使用ClipLazor库创建项目使用方法简单测...
目录简介快速入门安装 NuGet 包实体类User数据库类DbFactory...
本文实现一个简单的配置类,原理比较简单,适用于一些小型项...
C#中Description特性主要用于枚举和属性,方法比较简单,记录...
[TOC] # 原理简介 本文参考[C#/WPF/WinForm/程序实现软件开机...
目录简介获取 HTML 文档解析 HTML 文档测试补充:使用 CSS 选...