我正在寻找一种方法,使用C#.NET从MVC控制器重新启动当前正在运行的网站(来自管理页面)
为什么我需要它?我有一个网站的错误,但它只发生在网站运行一段随机的时间后,这使得它很难找到,同时我还需要一个远程方法,如果需要的话,可以快速从手机重启网站。
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文件中的numRecompilesBeforeAppRestart定义。默认值为15. ASP.NET监视文件中的任何更改。当更改某个数字(默认为15个)文件时,将自动重新启动Web应用程序。这样做的原因是为了节省服务器上的内存。在某些动态生成文件的网站上,这可能会导致频繁重启。
- 防病毒软件会更改文件的修改日期。防病毒程序会扫描Web.config或Global.asax等文件。某些防病毒程序会更改这些文件的修改日期,这会导致频繁重启,从而降低网站性能。
- IIS重新启动,所有网站也将重新启动。
- 更改Web应用程序的物理路径
- IIS由于不活动而回收网站(默认为20分钟)。如果网站没有访问者,IIS将从内存中卸载它以节省资源。下次访客来时,应用程序将再次启动。
这是我通常会重新启动应用程序的操作。
UnloadAppDomain
。
System.Web.HttpRuntime.UnloadAppDomain()
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 web表单上测试过。我也应该在MVC上工作。并且对于没有窗口添加此行processInfo.CreateNoWindow = true;
我曾经想要从应用程序注销所有用户时使用的一个非常简单的解决方案是通过在bin文件夹内创建/删除(如果存在)虚拟.dll文件。
你可以随心所欲地命名这个dll文件但是通过创建/删除它将重新启动整个应用程序(池)并修复你的问题。
这个解决方案的优点在于您不需要Web应用程序的特殊权限。
另一种选择是杀死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);