簡體   English   中英

從MVC控制器重新啟動IIS網站

[英]Restart IIS website from MVC controller

我正在尋找一種使用C#.NET從MVC控制器重新啟動當前正在運行的網站(從管理頁面)的方法。

我為什么需要它? 我在網站上有一個bug,但僅在網站運行了一段隨機時間后才會發生,這真的很難找到,同時如果需要,我仍然需要一種遠程方法來從手機中快速重新啟動網站。

由於許多原因,ASP.NET應用程序可能會重新啟動。 它可能比您想像的更多地發生。 ASP.NET Web應用程序將由於以下原因而重新啟動:

  • Web.Config文件中的更改。 更改任何參數,添加空格字符甚至更改文件的修改日期都將導致應用重啟。
  • 更改machine.config,就像更改web.config一樣。
  • 在/ bin文件夾中更改。 如果您添加,更新或刪除/ bin文件夾中的任何文件,應用程序將重新啟動。
  • 在App_Code文件夾中更改。 在App_Code中添加,刪除或編輯類將導致應用程序重新啟動。
  • 像在web.config中一樣,在Global.asax文件中進行更改。
  • App_LocalResources文件夾中的更改
  • App_GlobalResources文件夾中的更改
  • App_WebReferences文件夾中的更改
  • 配置文件配置更改
  • 已達到的編譯限制,在machine.config文件中使用numRecompilesBeforeAppRestart定義。 默認值為15。ASP.NET監視文件中的任何更改。 更改一定數量(默認為15個)的文件時,Web應用程序將自動重新啟動。 這樣做的原因是為了節省服務器上的內存。 在某些動態生成文件的網站上,這可能會導致頻繁重啟。
  • 防病毒軟件更改文件的修改日期。 防病毒程序將掃描Web.config或Global.asax之類的文件。 某些防病毒程序會更改這些文件的修改日期,從而導致重新啟動頻率很高,從而降低網站性能。
  • IIS重新啟動,所有網站也將重新啟動。
  • 更改Web應用程序的物理路徑
  • IIS由於不活動而回收了網站(默認為20分鍾)。 如果網站沒有訪問者,IIS將從內存中將其卸載以節省資源。 下一位訪客到來時,應用程序將再次啟動。

這是我通常會重新啟動應用程序所要做的。

  1. 從代碼中調用UnloadAppDomain ,盡管這樣做需要完全信任權限。

    System.Web.HttpRuntime.UnloadAppDomain()

  2. 故意更改gloabl.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 Web表單上對其進行了測試。我也應該在MVC上工作。 對於沒有窗口的情況,請添加以下行: processInfo.CreateNoWindow = true;

每當我想從應用程序中注銷所有用戶時,我曾經使用的一種非常簡單的解決方案是通過從bin文件夾中創建/刪除(如果存在)虛擬的.dll文件。

您可以根據需要命名該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);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM