通过ASP.NET MVC Controller更新AppSettings

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配置,但不保存.

  • 这非常有帮助.谢谢!:) (2认同)