Kei*_*ams 11 asp.net-mvc configuration configuration-files
我正在写一个基本的小论坛网络应用程序(为了好玩和锐化'锯'),我在使用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下运行,所以进程用户是我在任何情况下拥有该文件的所有权).
有任何想法吗?
Kur*_*ler 19
将您的第一行更改为:
var config = WebConfigurationManager.OpenWebConfiguration("~");
Run Code Online (Sandbox Code Playgroud)
尽管可能令人困惑,但OpenWebConfiguration需要Web.config所在的虚拟路径,不包括文件名.我猜逻辑是在任何给定目录中只有一个Web.config,因此包含名称是不必要的.
在MSDN文档最终线索我们在这里-如果你看的例子都使用明确的相对路径,以及IIS托管之下时,您可以指定其他位置,例如配置文件:
OpenWebConfiguration("/siteName", "Default Web Site", null, "myServer");
Run Code Online (Sandbox Code Playgroud)
附录:
那为什么要OpenWebConfiguration("~/Web.config")工作呢?我不确定我是否可以明确地解释它,但试着踢它:将它改为("〜/ Foo.bar").同样的结果!您可以阅读 - 您的Web.config文件相同 - 但无法写入!(现在尝试将foo.bar目录添加到您的站点,然后在其中放入一个Web.config ...)
由于OpenWebConfiguration需要一个目录(并且显然允许不存在的目录,只要它在父目录中找到Web.config),我认为这就是为什么错误地将〜/ Web.config指定为"路径"允许我们加载root配置,但不保存.