代码之家  ›  专栏  ›  技术社区  ›  Keith Williams

通过ASP.NET MVC控制器更新AppSettings

  •  11
  • Keith Williams  · 技术社区  · 15 年前

    我正在写一个基本的小论坛Web应用程序(为了好玩和磨快旧的“锯子”),我在应用程序设置方面遇到了一些问题。

    我的计划是将这些设置保存在自己的文件(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下运行,因此在任何情况下,进程用户都是拥有该文件所有权的我)。

    有什么想法吗?

    3 回复  |  直到 12 年前
        1
  •  19
  •   Elijah66    15 年前

    将您的第一行更改为:

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

    OpenWebConfiguration可能会令人困惑,但它需要web.config所在的虚拟路径, 排除 文件名。我猜逻辑是在任何给定的目录中都只有一个web.config,因此不需要包括名称。

    这个 MSDN documentation 最终在这里提示我们-如果您查看这些示例,它们都使用显式的相对路径,并且当托管在IIS下时,您可以从其他位置指定配置文件,例如:

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

    附录:

    那为什么呢? OpenWebConfiguration("~/Web.config") 干活了吗?我不确定我能确切地解释它,但是试试这个:把它改成 (“~/Fo.bar”) . 同样的结果!你可以阅读- 相同的web.config文件 -但不能写!(现在尝试将foo.bar目录添加到您的站点,然后在其中放置web.config…)

    因为openwebconfiguration需要一个目录(并且显然允许不存在的目录,只要它在父目录中找到web.config),所以我认为这就是为什么错误地将~/web.config指定为“path”允许我们加载根配置,但不保存它的原因。

        2
  •  1
  •   Venemo    15 年前

    试试这个:

    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文件。(最好是应用程序的“数据”文件夹,在该文件夹中,无法从Web访问它,并且您的应用程序已经具有读写权限。)

    然后,您可以将这类设置存储在该XML中,并使用System.xml或Linq to XML轻松地读写它。

        3
  •  0
  •   griegs    15 年前

    如果您是从另一个项目运行此配置,那么您将使用该文件夹中的配置,该文件夹没有配置文件,因此无法创建该文件。

    您可能需要使用server.mappath或类似的方法来访问web文件夹配置文件。