从MVC控制器重新启动IIS网站



我正在寻找一种方法来重新启动当前运行的网站(从管理页面)来自MVC控制器,带有C#.NET

为什么我需要它?我在一个网站上有一个bug,但它只发生在网站运行了一段随机的时间后,这让它很难找到,同时,如果需要的话,我仍然需要一种远程方式从手机快速重启网站。

每当我想从应用程序注销所有用户时,我都会使用一个非常简单的解决方案,那就是从bin文件夹中创建/删除(如果存在)一个伪.dll文件。

你可以随意命名这个dll文件,但通过创建/删除它将重新启动整个应用程序(池)并解决你的问题。。

这个解决方案的美妙之处在于,您不需要对web应用程序拥有特殊权限。

ASP.NET应用程序可能会重新启动,原因确实很多。它可能发生的次数比你想象的要多。ASP.NET web应用程序将重新启动,因为:

  • Web.Config文件中的更改。更改任何参数,添加空格字符,甚至更改文件的修改日期都会导致应用程序重新启动
  • machine.config中的更改,就像web.config一样
  • 更改/bin文件夹。如果您添加、更新或删除/bin文件夹中的任何文件,应用程序将重新启动
  • App_Code文件夹中的更改。在App_Code中添加、删除或编辑类将导致应用程序重新启动
  • Global.asax文件中的更改,如web.config中的更改
  • App_LocalResources文件夹中的更改
  • App_GlobalResources文件夹中的更改
  • App_WebReferences文件夹中的更改
  • 配置文件配置的更改
  • 已达到编译限制,该限制是用machine.config文件中的numRecomplesBeforeAppRestart定义的。默认值为15。ASP.NET监视文件中的任何更改。当特定数量(默认为15个)的文件发生更改时,web应用程序将重新启动自动地这样做的原因是为了节省服务器上的内存。在…上有些网站的文件是动态生成的,这可能会导致频繁重启
  • 防病毒软件更改文件的修改日期。防病毒程序扫描Web.config或Global.asax等文件。一些防病毒程序更改这些文件的修改日期重新启动,这会降低网站性能
  • IIS重新启动,所有网站也将重新启动
  • 更改web应用程序的物理路径
  • IIS由于不活动而回收网站(默认为20分钟)。如果网站没有访问者,IIS将从内存中卸载以保存资源。应用程序将在下次访问时重新启动来了

以下是我通常要做的重新启动应用程序的操作。

  1. 从代码中调用UnloadAppDomain,尽管这样做需要完全信任权限

    System.Web.HttpRuntime.UnloadAppDomain()

  2. 故意更改gloable.asax或web.config文件修改日期属性

    File.SetLastWriteTimeUtc(MapPath("~/global.asax"), DateTime.UtcNow);File.SetLastWriteTimeUtc(MapPath("~/web.config"), DateTime.UtcNow);

创建一个.bat文件名IISresart.bat

我在里面写

iisreset

iisreset停止然后启动IIS。

和ASP.net我写

            string str_Path = Server.MapPath(".") + "\IISresart.bat";
            ProcessStartInfo processInfo = new ProcessStartInfo(str_Path);
            processInfo.UseShellExecute = false;
            Process batchProcess = new Process();
            batchProcess.StartInfo = processInfo;
            batchProcess.Start();

并重新启动IIS。

注意。我在asp.net网页表单上测试过。我也应该在MVC上工作。对于没有窗口,添加此行processInfo.CreateNoWindow=true

另一个选项是终止w3wp进程。我不需要任何额外的权限让我的控制器运行以下内容:

var powershellCommand = @"get-process w3wp | stop-process";
var procInfo = new ProcessStartInfo("powershell")
{
    Arguments = $"/c {powershellCommand}",
    RedirectStandardError = true,
    RedirectStandardOutput = true,
    UseShellExecute = false
};
var p = Process.Start(procInfo);

最新更新