2015-12-07 4 views
1

Я разрабатываю приложение ASP.NET с использованием среды MVC 5. Это приложение в конечном итоге будет развернуто на месте. Поэтому пользователи должны иметь возможность устанавливать и настраивать приложение, прежде чем они смогут начать его использовать. Мне нужно, чтобы они могли указывать такие вещи, как имя базы данных (MSSQL), расположение различных вспомогательных служб и определенные учетные данные, такие как ключи API для сторонних служб.страница конфигурации для приложения mvc 5

В нескольких приложениях MVC 5, которые я использовал, эти параметры можно было бы управлять через форму. Поэтому я подумал о создании контроллера Configurations с действиями GET и POST Edit. Таким образом, пользователь может установить приложение, а затем перейти на 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 приведет к перезапуску пула приложений. Однако, похоже, это не так ...

Может кто-нибудь объяснить, что происходит?

+0

Решено ли это? – Nkosi

ответ

0

У вас не хватает,

WebConfigurationManager.Save(); 

в сообщении для редактирования.

Изменения, которые вы делаете, применяются только во время выполнения. Причина, по которой вы не вызываете перезапуск пула приложений, связана с тем, что вы не внесли изменений.

Вот ссылка, которую я нашел: modify the web config at run-time

ли Обратите внимание, что в долгосрочной перспективе, как указано в указанной ссылке вы не должны хранить параметры, отредактированные часто в вашем веб-конфигурации. Используйте файл XML или json для сохранения этих параметров и загрузки их по мере необходимости.

0

Если вы не вызываете метод Save в конфигурации, он не будет сохранен в физическом файле (Web.config). Это означает, что вы все равно сможете прочитать настройки ввода параметров приложения, которые вы установили, до тех пор, пока пул приложений не переработает. Но если перезагрузка вашего пула приложений/IIS будет перезапущена, вы потеряете все, что вы установили в AppSettings.

Метод сохранения записывает настройки конфигурации в текущий файл конфигурации XML.

Имейте в виду, что пользователь или процесс, который записывает данные файла конфигурации должны иметь следующие разрешения:

  • разрешение на запись на конфигурационный файл и каталог на текущем уровне иерархии конфигурации.
  • Прочитайте разрешения для всех файлов конфигурации.

Если вы действительно хотите, чтобы сохраняться настройки приложения записи в файлы, вы можете сделать это

[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) 
} 

enter image description here

В вашем случае, чтобы установить ключи имя & API сервер БД, вы должны вызвать метод Save, чтобы они сохранялись в файле и будут доступны позже, даже после перезапуска пула приложений.

Смежные вопросы