2009-11-16 92 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