微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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中或将其缓存在服务器上.如果数据是读/写,则将其放在基于实例的对象中.

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐