2009-11-16 89 views
10

我正在寫一個基本的小型論壇Web應用程序(爲了好玩,並加強了ole的鋸齒),並且我在AppSettings方面遇到了一些麻煩。通過ASP.NET MVC控制器更新AppSettings

我的計劃是在他們自己的文件(Settings.config)中設置這些設置,我將授予其修改權限給Web進程用戶帳戶,並將所有可編輯設置存儲在此文件中(例如論壇標題,說明,等等)。

這是我的代碼:

 
[AcceptVerbs(HttpVerbs.Post)] 
public ActionResult Edit(FormCollection collection) 
{ 
    try 
    { 
     var config = WebConfigurationManager.OpenWebConfiguration("~/Web.config"); 

     config.AppSettings.Settings["SiteTitle"].Value = collection["SiteTitle"]; 
     config.AppSettings.Settings["SiteDescription"].Value = collection["SiteDescription"]; 

     config.Save(ConfigurationSaveMode.Minimal, false); 
     ConfigurationManager.RefreshSection("appSettings"); 

     return RedirectToAction("Index"); 
    } 
    catch (Exception ex) 
    { 
     ModelState.AddModelError("_FORM", ex.Message); 
     return View("Index"); 
    } 
} 

...但運行它返回以下錯誤:

A configuration file cannot be created for the requested Configuration object.

我已經試過授予完全權限的所有用戶設置文件,沒有任何作用(我目前只是在Cassini下運行,所以過程用戶是我在任何情況下擁有該文件的所有者)。

任何想法?

回答

18

你的第一行改成這樣:

var config = WebConfigurationManager.OpenWebConfiguration("~"); 

混淆,因爲它可能是,OpenWebConfiguration預計在Web.config文件駐留在虛擬路徑,排除文件名。我想邏輯是,在任何給定的目錄中只有一個Web.config,因此包含名稱是不必要的。

MSDN documentation最終線索我們在這裏 - 如果你看的例子都使用明確的相對路徑,並在IIS下託管的時候允許你從其他位置指定配置文件,例如:

OpenWebConfiguration("/siteName", "Default Web Site", null, "myServer"); 

附錄:

那麼爲什麼OpenWebConfiguration("~/Web.config")工作呢?我不確定我是否可以明確地解釋它,但試試這個踢:改爲(「〜/ Foo.bar」)。同樣的結果!你可以閱讀 - 你的相同的Web.config文件 - 但不能寫! (現在嘗試將foo.bar目錄添加到您的站點,然後將Web.config放入其中...)

由於OpenWebConfiguration需要一個目錄(並且顯然允許不存在的目錄,只要它找到一個Web .config),我想這就是爲什麼錯誤地將〜/ Web.config指定爲「路徑」允許我們加載根配置,但不保存它。

+0

這實際上是一種我從未聽說過的非常有趣的行爲。 非常感謝您解釋它,因爲我在這方面也有點無知。 – Venemo 2009-11-22 20:13:42

+0

謝謝,這非常有趣 - 今晚我會說這個! – 2009-11-23 11:46:35

+1

像魅力一樣工作 - 謝謝! – 2009-11-23 19:44:13

0

如果你是從另一個項目運行這個,那麼你將使用該文件夾中的配置,該配置文件不會有配置文件,因此無法創建它的錯誤。

你可能想使用server.mappath或類似的東西來到Web文件夾配置文件。

+0

你能否澄清一下「從另一個項目中運行」是什麼意思? – 2009-11-17 17:23:19

+0

如果你有你的網站,你有你說的業務層,並且代碼在業務層項目中運行,那麼我懷疑它所尋找的配置文件將在業務層項目中。你需要找到網絡配置文件的路徑 – griegs 2009-11-17 20:31:06

+0

啊,我看到......實際上沒有,雖然我通常是這樣設置的,在這種情況下,我很懶,並且在「Models」文件夾中具有業務層我的MVC應用程序。 – 2009-11-21 13:19:13

1

試試這個:

var configFile = HttpContext.Current.Server.MapPath("~/Web.config"); 
var config = WebConfigurationManager.OpenWebConfiguration(configFile); 

不過,我認爲這是一個壞主意來存儲這種在Web.config的信息,尤其是如果它的目的是要動態地改變。

即使你打算使用一個單獨的配置文件,我寧願以另一種方式存儲它,並且我不打擾通過System.Configuration的類獲取我自己的配置。他們大多是爲了閱讀ASP.NET應用程序的Web.Config和Windows應用程序的App.Config,並使它們與其他東西一起工作是毫無意義的。

我提出以下建議:

添加一個單獨的XML文件到您的項目。 (最好到App_Data文件夾,無法從網絡訪問它,以及您的應用程序已具有讀取和寫入權限的位置。)

然後,您可以將此類設置存儲在該XML中,並輕鬆讀取使用System.Xml或LINQ將其寫入XML。

+0

是的,我知道這可能不是最好的方法 - 我真的只想看看它是否工作,並嘗試一些不同的東西(並且懶得在我的數據庫中設置一個設置表,如果我是誠實;)) – 2009-11-23 19:45:24

+1

@Venemo - 你的建議很有意義。使用XML文件更加實用,我們可以在沒有web.config限制的情況下自由讀寫。我也喜歡這個建議,把它放在已經授予了讀寫權限的AppData中。更不用說它可以被無數的應用程序共享。不是說我會走那麼遠:) – 2014-05-28 21:58:52

+0

@BenJunior - 謝謝:)我很高興我能幫上忙! – Venemo 2014-05-28 22:51:19