【问题标题】:how to restart asp.net application besides modifying web.config除了修改 web.config 之外,如何重新启动 asp.net 应用程序
【发布时间】:2018-11-02 12:35:19
【问题描述】:

除了从应用程序内部触摸 web.config 之外,是否有推荐的方法来反弹 asp.net 应用程序?是HttpRuntime.UnloadAppDomain();这样做的首选方法是什么?如果是这样,你在哪里做这个?在卸载页面或应用程序的其他地方?

【问题讨论】:

    标签: c# asp.net restart


    【解决方案1】:

    从应用程序内部触摸 web.config 是个坏主意,IMO。此外,IMO 修改文件的想法有点陈词滥调。

    文档明确指出UnloadAppDomain 将关闭应用程序:

    UnloadAppDomain 允许以编程方式关闭未使用的应用程序。

    您应该能够在应用程序的任何位置进行此调用。请注意,您可能会收到SecurityException,因此请确保运行时为您提供适当的权限(您可能希望将其放入库中并进行调用,然后在 GAC 中设置库并提供证据完全信任)。

    【讨论】:

    • 是的。这就是我问的原因。 web.config 修改看起来很丑陋,很可能让我们在 thedailyWTF.com 上发表文章 :)
    • 我认为更好的引用应该是:“终止当前应用程序。应用程序在下次收到请求时重新启动。”该引用中的“未使用”部分可以理解为“只有在没有人使用它时才会关闭”,但事实并非如此。
    • 使用 System.Web.HttpRuntime.UnloadAppDomain()
    【解决方案2】:

    如果这是 .NET 2.0 或更高版本,则可以添加“App_offline.htm”文件,向服务器发出请求,将其删除,然后向服务器发出另一个请求。

    只要文件夹中存在 app_offline.htm 文件,这一系列事件将强制 ASP.NET 卸载应用程序。

    Scott Guthrie 关于它的博客条目: http://weblogs.asp.net/scottgu/archive/2005/10/06/426755.aspx

    【讨论】:

    • 不只是让系统脱机。我希望它使用干净的缓存/会话等重新启动/重新加载。当我删除 app_offline.htm 时,默认情况下会恢复它吗?
    • @MikeJ - 没有。它会关闭应用程序并从服务器卸载应用程序域,直到文件被删除。
    • @MikeJ - 另请注意,这不是程序性更改。您需要实际添加和删除文件才能使其工作
    【解决方案3】:

    这段代码对我有用。只需调用它来重新加载应用程序。

    System.Web.HttpRuntime.UnloadAppDomain();
    

    Read more

    这个方法只会卸载我们的应用程序。如果您只是将此方法放在 ASP.NET Web 按钮中,那么您就完全完成了。那么我们的应用程序什么时候会重新加载呢?实际上,如果您单击按钮,它将首先启动我们的方法并卸载应用程序。在那一刻我们所在的网页上也会重新加载,因为我们只需单击一个按钮,网页就会刷新。启动我们的方法后,页面刷新过程也会导致我们的应用程序重新加载。

    【讨论】:

    • 似乎运行良好,而且绝对是这里给出的最简单的解决方案!
    【解决方案4】:

    您也可以停止和启动与应用关联的应用程序池。

    【讨论】:

    • 但这是来自 IIS 的权利。在某些情况下,我可能无法访问 IIS 框,所以我正在寻找一些程序化的东西。
    • 可以使用WMI回收应用程序池:blogs.iis.net/chrisad/archive/2006/08/30/…
    • 这将使用相同的 AppPool 回收每个应用程序。
    【解决方案5】:

    您可以通过调用 HttpRuntime.ShutdownAppDomain 方法来做到这一点(您需要使用反射来调用它,因为它是一个私有静态方法)

    请参阅How to restart an IIS Worker Process programmatically (i.e. shutdown the current ASP.NET Domain),了解我如何在“重新启动”REST API 中使用此方法的示例

    【讨论】:

      【解决方案6】:

      您可以通过在运行时在应用程序目录下创建或重命名文件夹来安全地重新启动 Web 应用程序。显然,您需要授予被分配运行应用程序的用户对 web 目录或其下的子目录的“修改”权限。

      该方法在 http://www.bartlannoeye.be/blog/restarting-a-.net-web-application-without-restarting-iis

      在我的情况下,我使用了以下代码来执行此操作。修改它以在“可写”子目录上工作

      protected void RestartButton_Click(object sender, EventArgs e)
      {
          //restart web app (instead of iisreset)
          DirectoryInfo dir = new DirectoryInfo(Server.MapPath("restart"));
          if (dir.Exists)
          {
              Directory.Move(dir.FullName, dir.FullName + "ed");
          }
          else
          {
              DirectoryInfo dired = new DirectoryInfo(Server.MapPath("restarted"));
              if (dired.Exists)
              {
                  Directory.Move(dired.FullName, dir.FullName);
              }
              else
              {
                  Directory.CreateDirectory(dir.FullName);
              }
          }
      }
      

      【讨论】:

      • 这对我不起作用。我看到正在创建目录,但没有调用 application_Start 事件!
      • Bart Lannoeye 链接似乎已失效
      【解决方案7】:

      如果您不想停止并启动应用程序池,您可以随时回收它。

      【讨论】:

        猜你喜欢
        • 2010-10-11
        • 2011-01-10
        • 2023-04-01
        • 2010-10-02
        • 2011-01-10
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-03-28
        相关资源
        最近更新 更多