2009-05-19 49 views
1

我有一個ASP.NET應用程序是一個更大的系統的一部分;它從Web應用程序根級別以上的文件中讀取大部分配置。如何在文件更改時讓ASP.NET重新啓動?

當應用程序已經寫入,並選擇配置文件的格式,按客戶來緩解編輯我不能利用該解決方案在「Shared configuration files in .NET」.

我希望ASP.NET有一個API,我可以致電啓動時間來告訴它要觀看哪個文件。 (我可以使用「FileSystemWatcher」來捕捉事件,然後自己重​​新啓動,然而這很遺憾,因爲ASP.NET已經具有代碼來監視文件並在更改時重新啓動它們)。

還有什麼ASP.NET API可以讓我們以很好的方式重新啓動ASP.NET?

這些都是一些鏈接我已經發現,可以幫助: Using the FileSystemWatcher from ASP.NETExtending FileSystemWatcher to ASP.NET


在一種情況下,我緩存在ASP.NET緩存的配置和設置的CacheDependency的文件。在另一種需要更快訪問的情況下,我使用FileSystemWatcher並在配置更改時更新了靜態字段。

(我從來沒有找到如何從代碼以合理的方式重新啓動ASP.NET。)

回答

4
static FileSystemWatcher ConfigWatcher; 

    static void StartWatchConfig() { 

    ConfigWatcher = new FileSystemWatcher("configPath") { 
     Filter = "configFile" 
    }; 

    ConfigWatcher.Changed += new FileSystemEventHandler(ConfigWatcher_Changed); 
    ConfigWatcher.EnableRaisingEvents = true; 
    } 

    static void ConfigWatcher_Changed(object sender, FileSystemEventArgs e) { 
    HttpRuntime.UnloadAppDomain(); 
    } 
-1

我想你將需要創建一個使用FileSystemWatcher的監視更改配置文件服務在Web應用程序的目錄之外 - 然後當檢測到更改時,對Web應用程序的web.config文件進行非重要更改並保存它,這將重新啓動應用程序。

+0

我希望有一個更好的辦法 – 2009-05-20 15:16:49

4

如果您知道您的應用永遠不會訪問HttpContext之外的配置,請考慮緩存您的配置並在文件中添加CacheDependency。如果文件更改,您的緩存配置將被刪除,您可以重新添加更新的值。

喜歡的東西:

public MyConfigObj GetConfig() 
{ 
    var config = Cache["configkey"] as MyConfigObj; 
    if(config == null) 
    { 
     var configPath = Server.MapPath("myconfigpath"); 
     config = GetConfigFromFile(configPath); 
     Cache.Insert("configkey", config, new CacheDependency(configPath)); 
    } 
    return config; 
} 
+0

謝謝,這個答案將是很多人有用的;但是我們需要重新啓動才能使用更改後的配置。如果我再次開始這將是一個有趣的選項來考慮 – 2009-05-20 15:35:07

+0

我是這個答案的例外,因爲它最接近解決我的根本問題。我緩存了一個配置文件;在另一種情況下,我使用FileSystemWatcher並在文件更改時更新了一個靜態字段。 – 2009-08-27 08:57:53

-1

愚蠢的答案也許,但你總是可以「觸摸」(添加一些空白或某事),你的web.config文件,這將觸發重新啓動。它是窮人的IISRESET =)

(我想再次強調,這是不以網站一般重新啓動或重置IIS)

+0

問題是,當人們忘記這麼做時,我們會收到很多錯誤報告! – 2009-05-20 15:13:27

1

的理想解決方案。對於第二部分,你可以用下面的一段代碼來觸發AppPool回收(這與重新啓動IIS相同,只在應用程序級而不是整個服務器上)。

using System.DirectoryServices; 

public void RecycleAppPool(string machine, string appPoolName) 
{ 
    string path = "IIS://" + machine + "/W3SVC/AppPools/" + appPoolName; 
    DirectoryEntry w3svc = new DirectoryEntry(path); 
    w3svc.Invoke("Recycle", null); 
} 

(從here

相關問題