我正在使用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
上的表单上更改这些变量,并且它们可以保持正常。两个问题:
web.config
但我检查了我的应用程序中的web.config
个文件,但没有一个有更新的值。在表单上,我将ClientID更新为“123”,但在web.config
中它仍然显示“testID”,这是原始默认值。web.config
会导致应用池重启。然而,这似乎并非如此...... 有人可以解释发生了什么吗?
答案 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
在您的情况下,设置数据库服务器名称&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)
}
方法,以便它们保存在文件中,并且即使在应用程序池重新启动后也可以使用。