代码之家  ›  专栏  ›  技术社区  ›  Daniel Auger

在解析/检查Web.config的更改之前,是否有要处理的事件/要重写的方法?

  •  2
  • Daniel Auger  · 技术社区  · 16 年前

    我想知道是否有一个事件可以被处理,或者有一个方法可以被重写,它发生在 Web.config 文件由asp.net 3.5应用程序/AppDomain生命周期进行分析和监视。

    这样做的实际原因是我希望能够写出 Web.config Web.config 由于手动过程的原因,更改通常会出现裂缝,或者无法传播到web场上的所有服务器。不幸的是,在可预见的未来,我们将继续采用手动部署过程。在这种情况下,如果有一种方法可以让应用程序在第一次启动时抓取其web配置,那就太好了。如果我能让它正常工作,下一个合乎逻辑的事情就是创建一个SQL依赖项/通知,每当数据库中的配置文件发生更改时,就会导致AppDomain卸载,这样新的更改就会被提取和写入。

    到目前为止,我找到的唯一解决方法是执行类似于下面的psuedocode的操作,它有一个不幸的副作用,即每次尝试启动都会导致两个应用程序加载周期。此外,我非常确定,如果应用程序处于空闲状态,第一个请求将由于重启而失效。

    // PSEUDOCODE
    // In global.asax.cx
    protected void Application_Start(object sender, EventArgs e)
    {
       bool loadConfigFileFromDB = GetConfigLoadOptionFromLoadOptionsConfigFile();
       string webConfigPath = GetWebConfigPath();
    
       if (loadConfigFileFromDB)  // Most likely false in development so debugging works
       {                          // with a local web.config
    
          if (File.Exists(webConfigPath))  // We are not starting up for the first time 
          {                                // since app was deployed
             if (File.GetCreationTime(webConfigPath) < DateTime.Now.AddMinutes(-1))
             {
                // Web config is more than a minute old, so chances are we
                // aren't in an app restart after writing the config.
                WriteWebConfigFromDatabase(); // This will cause a restart.
             }
    
             // else, web.config was probably just written and we are in a 
             // restart after writing the config. In this case, let the application continue on
          }
          else // First time starting up, so it's safe to assume we can write
          {    // the config and restart.
             WriteWebConfigFromDatabase(); // This will cause a restart.
          } 
       }            
    }
    

    显然,构建或部署任务将是处理每个环境替换Web.config的最佳方式,但不幸的是,我现在的情况不是这样的。

    编辑

    这样做的目的不是在应用程序运行时进行动态设置,而是帮助管理每个环境中不同的Web.config文件(Stage/QA/Production)。例如,在一个单独的非Web.config文件中,我们有一个环境设置。当应用程序启动时,部署完成后,它将使用此文件中的设置(环境和连接字符串)为该环境拉入并写入web配置。应用程序启动后,设置不会是动态的。

    3 回复  |  直到 8 年前
        1
  •  2
  •   Dmytrii Nagirniak    16 年前

    你在做奇怪的事。


    好啊因此,您需要自动向所有服务器传播应用程序的新版本。我不认为有理由从应用程序本身来做这件事。相反,它应该是另一个实用程序/批处理/安装程序来完成这类工作。

    我会为你做这项工作

    1. 创建一个接受1个参数的.bat文件:environment=[Stage/QA/Production]。
    2. 将所有必需的文件复制到一个单独的临时目录(这样您就可以在不接触原始代码的情况下修改内容)。
    3. 根据环境参数修改web.config和其他您需要的内容(您可以为此使用一些实用程序)。
    4. 根据环境参数将所有文件复制到所有必需的服务器。

    不需要将部署过程合并到应用程序本身中。
    对于Windows应用程序,可以使用引导程序,但对于ASP.NET则不行。

        2
  •  0
  •   Sam    16 年前

    Application_End是最近的事件-它在卸载web应用程序的AppDomain之前触发。您可以在那里更新Web.config文件。

    另外,我假设ASP.NET停止监视Web.config以了解进一步的更改,因为它已经决定关闭应用程序-我唯一担心的是再次写入文件会导致无限循环发生。

    试试也无妨。但这是一件奇怪的事情。最好能有更多的背景知识来说明为什么你首先需要这么做。

        3
  •  0
  •   Daniel Auger    16 年前

    我想知道是否有活动 可以处理的或 可以覆盖发生的事件 在解析Web.config文件之前 并由asp.NET3.5进行监控 应用程序/应用程序域生命周期。

    在做了几天的研究之后,我想说这个问题的答案是:不,没有这样的事件可以处理或方法可以避免。如果有人出现,并且可以显示其他情况,我将取消选择此作为问题的答案。