簡體   English   中英

從同一個池中的asp.net應用程序以編程方式回收池

[英]programatically recycle pool from asp.net application in same pool

有一個ASP.net Web應用程序,可以正常工作幾天,但隨后會隨機拋出一些數據庫連接字符串異常,因此0個記錄列在一個表中(應顯示數百個)。 我花了很多周調試,內存很好,數據庫存在,並通過做任何會導致應用程序回收的東西來修復它。 需要很多天等待甚至重現。

所以我在想,因為我知道永遠不應該有0條記錄,如何強制運行Web應用程序的應用程序池進行回收(當我得到這個數據庫異常或0條記錄時)。 至少這種方式,網站將為下一個用戶工作,我不必手動重新啟動它。

由於復雜性,我從未對此解決方案感到滿意,但也因為安全要求不明確(如果您必須為應用程序用戶授予權限,那不僅是另一個配置步驟,而且還有安全性風險,似乎讓應用程序用戶有權不加選擇地回收應用程序池,特別是在網絡上,可以在DOS攻擊中利用它。

在我有限的情況下,我發現了一些關鍵條件,我能夠通過重新啟動來解決並在執行期間進行檢測但是還無法阻止通過更加可口的代碼更改,並且經過大量研究后,我經歷了其他幾個解決方案(好的) - 黑客 )完成這項工作。 1.在新生成的線程上拋出未處理的異常,2。Environment.Exit Environment.Exit()和3. System.Web.HttpRuntime.UnloadAppDomain() 這些具有相當令人討厭的副作用,即終止所有正在進行的請求,這無疑是一個可怕的黑客攻擊,但在某些情況下是可以忍受的(例如,發現的情況阻止了對絕大多數請求的正確處理)。

這個黑客的厭惡一直伴隨着我多年,直到我最近偶然發現了這個簡單的小寶石,完全避免了WMI

System.Web.Hosting.HostingEnvironment.InitiateShutdown();

我的測試表明它完全符合我的需要,我相信這也是你想要的。 根據文檔,它自.NET 2.0以來一直存在,但直到幾天前我才在研究中遇到它。

您好,在本文中,您可以找到從Asp.net重新啟動應用程序池的相關代碼

從ASP.NET頁面重新啟動IIS應用程序池

using System;
using System.Web;
using System.Web.UI;
using System.Management;
using System.DirectoryServices;
using System.Web.UI.WebControls;

public partial class iis : System.Web.UI.Page
{
    protected void Page_Load(object sender, EventArgs e)
    {
        Response.Write(System.Environment.MachineName);
        status();
    }

    protected void status()
    {
        string appPoolName = "dev.somesite.com";
        string appPoolPath = @"IIS://" + System.Environment.MachineName + "/W3SVC/AppPools/" + appPoolName;
        int intStatus = 0;
        try
        {
            DirectoryEntry w3svc = new DirectoryEntry(appPoolPath);
            intStatus = (int)w3svc.InvokeGet("AppPoolState");
            switch (intStatus)
            {
                case 2:
                    lblStatus.Text = "Running";
                    break;
                case 4:
                    lblStatus.Text = "Stopped";
                    break;
                default:
                    lblStatus.Text = "Unknown";
                    break;
            }
        }
        catch (Exception ex)
        {
            Response.Write(ex.ToString());
        }
    }
    protected void stopAppPool(object sender, EventArgs e)
    {
        Button btn = (Button)sender;
        string appPoolName = btn.CommandArgument;
        string appPoolPath = @"IIS://" + System.Environment.MachineName + "/W3SVC/AppPools/" + appPoolName;
        try
        {
            DirectoryEntry w3svc = new DirectoryEntry(appPoolPath);
            w3svc.Invoke("Stop", null);
            status();
        }
        catch (Exception ex)
        {
            Response.Write(ex.ToString());
        }
    }

    protected void startAppPool(object sender, EventArgs e)
    {
        Button btn = (Button)sender;
        string appPoolName = btn.CommandArgument;
        string appPoolPath = @"IIS://" + System.Environment.MachineName + "/W3SVC/AppPools/" + appPoolName;
        try
        {
            DirectoryEntry w3svc = new DirectoryEntry(appPoolPath);
            w3svc.Invoke("Start", null);
            status();
        }
        catch (Exception ex)
        {
            Response.Write(ex.ToString());
        }
    }
}

暫無
暫無

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

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