29

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

4

7 回答 7

26

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

该文档特别指出UnloadAppDomain将关闭应用程序:

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

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

于 2009-01-02T19:21:01.580 回答
16

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

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

Scott Guthrie 的博客文章: http ://weblogs.asp.net/scottgu/archive/2005/10/06/426755.aspx

于 2009-01-02T19:14:56.587 回答
15

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

System.Web.HttpRuntime.UnloadAppDomain();

阅读更多

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

于 2015-12-08T11:12:02.230 回答
6

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

于 2009-01-02T19:02:48.153 回答
4

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

有关我如何在“重新启动”REST API 中使用此方法的示例,请参阅如何以编程方式重新启动 IIS 工作进程(即关闭当前的 ASP.NET 域)

于 2013-04-20T00:17:59.440 回答
2

您可以通过在运行时在应用程序目录下创建或重命名文件夹来安全地重新启动 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);
        }
    }
}
于 2013-06-12T04:25:46.517 回答
0

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

于 2009-01-02T19:46:54.213 回答