2013-06-04 212 views
1

我需要在維護過程中關閉我的Web應用程序,已經通過很多方式將app_offline.htm放入根目錄,禁用Runtime或通過服務器手動禁用它,但是我需要實現是要完成這個過程的完全自動化。關閉Web應用程序

我所擁有的是開始和結束日期關閉和標誌的那些日子,即應用程序是否需要關閉這些日期。

我已經擁有的解決方案是在sql server代理中創建一個作業,它在根目錄中創建和刪除app_offline.htm文件,但是問題是我需要爲我的根目錄提供靜態路徑我不想做的應用程序。

+0

您正在使用什麼版本的IIS的?而不是提供靜態路徑,您可以探測IIS以獲取確切的路徑。 – AlwaysAProgrammer

+0

我使用IIS 7.5,我必須從sql服務器探測iis,我不知道它是如何完成的,如果可能的話,請指導我。 –

+0

您可以通過編程方式停止應用程序池。不確定這是否是您的要求。查看我的答案以獲取應用程序的物理路徑。 – AlwaysAProgrammer

回答

1

您可以使用appcmd命令行實用程序來管理IIS上的網站。它位於%systemroot%\system32\inetsrv\APPCMD。我認爲它僅在IIS v7和更高版本中可用,但不確定是否使用舊版本的IIS。

要停止和啓動一個網站,該命令將如下所示:

%systemroot%\system32\inetsrv\APPCMD stop site <Your Site's Name> 

%systemroot%\system32\inetsrv\APPCMD start site <Your Site's Name> 

在APPCMD實用程序的更多信息是在這裏:http://www.iis.net/learn/get-started/getting-started-with-iis/getting-started-with-appcmdexe

0

一個問題,你在這裏是Web應用程序在請求的基礎上工作。您提出請求,處理並返回請求。因此,依靠這個原則來關閉你的應用程序將不起作用。你需要的是在Application_Start中註冊某種類型的調度程序,它將根據數據庫中的值進行自我配置。儘管我不確定哪種調度機制是合適的,但您可能需要查看Timer(但由於垃圾回收,您必須保留對該對象的引用)或System.Threading.Tasks namespace中的任務調度程序。

我可能是錯誤的選擇類,但這可能是一個起點。

現在,至於你設計的決定,我會完全避免它。如果您的Web應用程序可以創建app_offline.html或將文件重命名爲該文件,則無法通過刪除該文件而無需手動干預將服務器重新聯機。而不是爲什麼不創建一些維護Windows服務,可以查詢數據庫並脫機並重新聯機?如果您不關心自動將Web應用程序聯機,那麼您不應該在意將其自動脫機。

要考慮的另一件事是配置應用程序脫機時的人爲錯誤。錯誤配置的時間可能會太早或過晚導致應用程序失敗。如果您創建了一些批處理腳本或PowerShell腳本,可以取消並恢復Web應用程序,這會不會更容易?藉助PowerShell腳本,您可以查詢您的應用程序的IIS而無需指定任何物理位置。

1

這是處理探測IIS以獲取物理路徑的答案的一部分。它可能需要一些調整

  //eg of site = 'Default Web Site' 
     //eg of Application = 'MySite' 
     var appName = "MySite"; 
     //Initializes a new instance of the ServerManager class by using the default path of the ApplicationHost.config file. 
     ServerManager mgr = new ServerManager(); 
     var applications = mgr.Sites.Cast<Site>().SelectMany(s => s.Applications); 

     var app = applications.SingleOrDefault(a => a.Path.Equals("/" + appName)); 

     IList<string> physicalPaths = app.VirtualDirectories.Cast<VirtualDirectory>().Select(v => v.PhysicalPath).ToList(); 

     //Calling dispose manually. Per MSDN, cannot wrap the ServerManager instance in 'Using' as it causes memory leaks 
     mgr.Dispose(); 

     //Releasing the reference to the Server Manager, per MSDN guidance 
     mgr = null; 
     return physicalPaths; 
+0

'mgr'應該位於'using'塊中,並且不需要將其設置爲'null'。 –

+0

@John per MSDN,在使用塊中包裝管理器導致內存泄漏 – AlwaysAProgrammer

+0

請發佈說明引起內存泄漏的鏈接。它沒有任何意義,因爲Dispose執行相同的操作。 –