mvc 5应用程序

时间:2015-12-07 22:39:00

标签: c# asp.net-mvc iis asp.net-mvc-5 web-config

我正在使用MVC 5框架开发ASP.NET应用程序。该应用程序最终将部署在本地。因此,用户需要能够在开始使用之前安装和配置应用程序。我需要它们能够指定诸如数据库名称(MSSQL),各种支持服务的位置以及某些凭证(如第三方服务的API密钥)之类的内容。

在我使用的一些MVC 5应用程序中,可以通过表单管理这些设置。所以我想到了用GET和POST Edit动作创建一个Configurations控制器。因此,用户可以安装该应用,然后转到http://myServer/myApp/Config并指定其中的各种设置。

我不确定的是那些设置将被存储的位置。它是web.config文件,settings.xml文件还是数据库?

这是奇怪的事情......我已经有一个使用以下代码web.config的工作解决方案:

public class ConfigController : Controller
{

    // GET: Config/Edit/5
    [HttpGet]
    public ActionResult Edit()
    {
        ViewBag.DatabaseServer = WebConfigurationManager.AppSettings["DatabaseServer"];
        ViewBag.DatabaseName = WebConfigurationManager.AppSettings["DatabaseName"];
        ViewBag.PusherClientID = WebConfigurationManager.AppSettings["ClientID"];
        ViewBag.PusherAPIKey = WebConfigurationManager.AppSettings["APIKey"];
        return View();
    }

    // POST: Config/Edit/5
    [HttpPost]
    public ActionResult Edit(FormCollection collection)
    {
        WebConfigurationManager.AppSettings.Set("DatabaseServer", collection.Get("databaseserver"));
        WebConfigurationManager.AppSettings.Set("DatabaseName", collection.Get("databasename"));
        WebConfigurationManager.AppSettings.Set("ClientID", collection.Get("pusherclientid"));
        WebConfigurationManager.AppSettings.Set("APIKey", collection.Get("pusherapikey"));

        return RedirectToAction("Edit");
    }
}

我的web.config文件:

<appSettings>
    ...
    <add key="DatabaseServer" value="localhost\sqlexpress" />
    <add key="DatabaseName" value="MyDatabase" />
    <add key="ClientID" value="testID" />
    <add key="APIKey" value="testkey" />
</appSettings>

我可以在edit.cshtml上的表单上更改这些变量,并且它们可以保持正常。两个问题:

  1. 我无法弄清楚他们去哪了。我被告知他们进入web.config但我检查了我的应用程序中的web.config个文件,但没有一个有更新的值。在表单上,​​我将ClientID更新为“123”,但在web.config中它仍然显示“testID”,这是原始默认值。
  2. 我被告知更新web.config会导致应用池重启。然而,这似乎并非如此......
  3. 有人可以解释发生了什么吗?

2 个答案:

答案 0 :(得分:0)

你不见了

WebConfigurationManager.Save();

在您的帖子中进行编辑。

您正在进行的更改仅在运行时应用。您没有导致应用程序池重新启动的原因是您尚未提交更改。

以下是我发现的参考资料:modify the web config at run-time

请注意,从参考链接中所述的长期运行中,您不应存储在Web配置中经常编辑的设置。使用XML或json文件存储这些设置并根据需要加载它们。

答案 1 :(得分:0)

除非您在配置上调用git push origin <commit number>:<remote branch name>方法,否则不会将其持久保存到物理文件(Save)。这意味着,在应用程序池回收之前,您仍然可以读取您设置的应用程序设置条目值。但是,如果您的应用程序池回收/ IIS重新启动,您将丢失您为AppSettings设置的任何内容。

Save方法将配置设置写入当前的XML配置文件。

请记住,写入配置文件条目的用户或进程必须具有以下权限:

  • 对当前配置层次结构级别的配置文件和目录的写入权限。
  • 读取所有配置文件的权限。

如果您确实要将应用设置条目保留到文件中,则可以执行此操作

Web.config

enter image description here

在您的情况下,设置数据库服务器名称&amp; api密钥,您应该调用[HttpPost] public ActionResult Edit(FormCollection collection) { var config = WebConfigurationManager.OpenWebConfiguration("~"); var db = config.AppSettings.Settings["DatabaseServerName"]; if (db != null) { config.AppSettings.Settings["DatabaseServerName"].Value = id; } else { var dbEntry=new KeyValueConfigurationElement("DatabaseServerName",id); config.AppSettings.Settings.Add(dbEntry); } config.Save(); // to do : Redirect to a success action (PRG pattern) } 方法,以便它们保存在文件中,并且即使在应用程序池重新启动后也可以使用。