Модифицировать раздел appSettings файла web.config программно [дублировать]

Я определил свое изображение следующим образом:

<Image Source="/Resources/Images/icon.png"/>

Изображение отображается в дизайнере Visual Studio , но при запуске приложения изображение не отображается! Это сделало меня сумасшедшим! Я попытался выполнить все Build Action s с помощью clean / build, не повезло.

В моем случае проблема вызвана тем, что элемент управления (который использует Image ), и само приложение находится в разных проектах. Ресурсы / Изображения находятся в проекте Controls . В результате приложение попыталось найти icon.png в своей собственной папке Debug, но на самом деле оно находится в папке Debug Controls .

Итак, для меня работают два решения:

1) поместите Resources / Images в проект приложения (не очень хорошо, когда есть несколько проектов, которые используют элементы управления из проекта Controls , но он работает)

2) явно указать имя проекта Controls внутри Изображение :

<Image Source="/Controls;component/Resources/Images/icon.png"/>
77
задан jerbersoft 15 March 2015 в 03:37
поделиться

7 ответов

Вам нужно использовать WebConfigurationManager.OpenWebConfiguration(): Пример:

Dim myConfiguration As Configuration = System.Web.Configuration.WebConfigurationManager.OpenWebConfiguration("~")
myConfiguration.ConnectionStrings.ConnectionStrings("myDatabaseName").ConnectionString = txtConnectionString.Text
myConfiguration.AppSettings.Settings.Item("myKey").Value = txtmyKey.Text
myConfiguration.Save()

Я думаю, вам также может потребоваться установить AllowLocation в machine.config. Это логическое значение, указывающее, можно ли настроить отдельные страницы с помощью элемента. Если «allowLocation» является ложным, его нельзя настроить в отдельных элементах.

Наконец, имеет значение, если вы запускаете свое приложение в IIS и запускаете свой тестовый образец из Visual Studio. Идентификатор процесса ASP.NET - это учетная запись IIS, службы ASPNET или NETWORK (в зависимости от версии IIS).

Возможно, необходимо предоставить службы ASPNET или NETWORK. Изменить доступ к папке, где находится web.config.

79
ответ дан Mitch Wheat 22 August 2018 в 20:45
поделиться
  • 1
    Спасибо за ответ Митч. Вы ответили на мой вопрос. То, что я сделал, я запускал VS 2008 как Администратор, и все было в порядке. – jerbersoft 6 April 2009 в 01:43

2012 Это лучшее решение для этого сценария (проверено с помощью Visual & nbsp; Studio & nbsp; 2008 ):

Configuration config = WebConfigurationManager.OpenWebConfiguration(HttpContext.Current.Request.ApplicationPath);
config.AppSettings.Settings.Remove("MyVariable");
config.AppSettings.Settings.Add("MyVariable", "MyValue");
config.Save();

Обновление 2018 => Протестировано против 2015 г. - Asp. net MVC5

var config = System.Web.Configuration.WebConfigurationManager.OpenWebConfiguration("~");
config.AppSettings.Settings["MyVariable"].Value = "MyValue";
config.Save();

, если вам нужно проверить элемент, используйте этот код:

var config = System.Web.Configuration.WebConfigurationManager.OpenWebConfiguration("~");
if (config.AppSettings.Settings["MyVariable"] != null)
{
config.AppSettings.Settings["MyVariable"].Value = "MyValue";
}
else { config.AppSettings.Settings.Add("MyVariable", "MyValue"); }
config.Save();
17
ответ дан Amin Ghaderi 22 August 2018 в 20:45
поделиться
  • 1
    Не могли бы вы немного объяснить, почему это лучше? Я знаю, что содержимое configSection иногда немного сложно. – julealgon 31 July 2013 в 19:41
  • 2
    Этот код меньше и понятен! По крайней мере для меня. – Amin Ghaderi 1 August 2013 в 00:54
  • 3
    О, это из-за личного вкуса, тогда я на самом деле думал, что это было логически иначе. Я очень не согласен с вами в этом случае, хотя и по целому ряду причин: во-первых, потому что вам нужно указать один и тот же ключ дважды, второй, потому что то, что вы делаете, семантически отличается от того, что действительно необходимо («update» vs 'remove- & gt , add ') и третий, потому что код на самом деле длиннее (не уверен, почему вы здесь что-то здесь) и открываете для ошибок. Кроме того, что, если по какой-то причине ваш код не работает между вызовами? Я думаю, ваше заявление нарушено. – julealgon 1 August 2013 в 16:33
  • 4
    Этот код стирает любой комментарий, принадлежащий MyVariable. – blagus 8 March 2016 в 18:21
  • 5
    Да, точно ! Этот код будет переписан всеми переменными, но он работает. но я не рекомендую использовать его, когда вы используете код комментария. Спасибо. – Amin Ghaderi 10 January 2017 в 11:19

И если вы хотите избежать перезагрузки приложения, вы можете переместить раздел appSettings:

<appSettings configSource="Config\appSettings.config"/>

в отдельный файл. И в комбинации с ConfigurationSaveMode.Minimal

var config = System.Web.Configuration.WebConfigurationManager.OpenWebConfiguration("~");
config.Save(ConfigurationSaveMode.Minimal);

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

21
ответ дан Ciprian Teiosanu 22 August 2018 в 20:45
поделиться

Попробуйте это:

using System;
using System.Configuration;
using System.Web.Configuration;

namespace SampleApplication.WebConfig
{
    public partial class webConfigFile : System.Web.UI.Page
    {
        protected void Page_Load(object sender, EventArgs e)
        {
            //Helps to open the Root level web.config file.
            Configuration webConfigApp = WebConfigurationManager.OpenWebConfiguration("~");
            //Modifying the AppKey from AppValue to AppValue1
            webConfigApp.AppSettings.Settings["ConnectionString"].Value = "ConnectionString";
            //Save the Modified settings of AppSettings.
            webConfigApp.Save();
        }
    }
}
0
ответ дан Eric Citaire 22 August 2018 в 20:45
поделиться

Изменение web.config обычно приводит к перезапуску приложения.

Если вам действительно нужно, чтобы ваше приложение редактировало свои собственные параметры, вам следует рассмотреть другой подход, например, установить базу данных или создать файл xml с редактируемыми настройками.

24
ответ дан Joel 22 August 2018 в 20:45
поделиться
  • 1
    Привет, спасибо за ответ. Но есть такая "Конфигурация" класс, который имеет «Сохранить». функция. Вам действительно нужно перезапустить приложение, чтобы новые настройки были активными? – jerbersoft 6 April 2009 в 01:26
  • 2
    Изменение web.config автоматически запускает перезапуск приложения. – Mike Cole 11 October 2012 в 18:25
  • 3
    Не рекомендуется изменять изменения в web.config. Я бы предпочел сохранить значение в файле (xml). – Deepak Mishra 8 October 2014 в 08:08
  • 4
    может кто-нибудь объяснить, почему перезапуск приложения плох, и многие рекомендуют переместить атрибут в другой файл? – Ben 27 September 2017 в 14:20
  • 5
    @Ben - Я знаю, что прошло несколько месяцев, но на всякий случай - перезапуск приложения будет означать, что любой, кто войдет в ваше приложение в момент перезагрузки, автоматически выйдет из системы и, скорее всего, столкнется с ошибкой. (несмотря на различные сценарии, такие как веб-фермы ...). сердитые пользователи контактируют с вами, поддерживают контакты вы и т. д. и т. д. ... – Fetchez la vache 19 January 2018 в 16:18

Кому нравится прямо в точку,

В вашем Config

    <appSettings>

    <add key="Conf_id" value="71" />

  </appSettings>

в вашем коде (c #)

///SET
    ConfigurationManager.AppSettings.Set("Conf_id", "whateveryourvalue");
      ///GET              
    string conf = ConfigurationManager.AppSettings.Get("Conf_id").ToString();
2
ответ дан mzonerz 22 August 2018 в 20:45
поделиться

Я знаю, что этот вопрос старый, но я хотел опубликовать ответ, основанный на текущем состоянии дел в мире ASP.NET \ IIS, в сочетании с моим опытом в реальном мире.

Недавно я возглавил проект в моей компании, где я хотел консолидировать и управлять всеми приложениями & amp; connectionStrings в наших файлах web.config в одном центральном месте. Я хотел продолжить подход, когда наши настройки конфигурации были сохранены в ZooKeeper из-за того, что проекты зрелости и amp; стабильность. Не говоря уже о том, что ZooKeeper представляет собой конфигурацию и amp; приложение для управления кластерами.

Цели проекта были очень простыми:

  1. передают ASP.NET для связи с ZooKeeper
  2. в Global.asax, Application_Start - вытащите настройки web.config из ZooKeeper.

Получив техническую часть получения ASP.NET, чтобы поговорить с ZooKeeper, я быстро нашел и ударил стену с помощью следующего кода:

ConfigurationManager.AppSettings.Add(key_name, data_value)

Это утверждение было наиболее логичным, поскольку я хотел добавить новые настройки в коллекцию appSettings. Однако, как упоминал оригинальный плакат (и многие другие), этот кодовый вызов возвращает сообщение об ошибке, указывающее, что коллекция доступна только для чтения.

Проведя немного исследований и увидев все безумные способы, которыми люди работали над этой проблемой, я был очень обескуражен. Вместо того, чтобы отказаться от того, что казалось менее реалистичным сценарием, я решил вскочить и посмотреть, не хватает ли я чего-то.

С небольшим количеством проб и ошибок я обнаружил, что следующий код будет делать именно то, что я хотел;

ConfigurationManager.AppSettings.Set(key_name, data_value)

Используя эту строку кода, теперь я могу загрузить все 85 appSettings от ZooKeeper в моем приложении Application_Start.

Что касается общих утверждений об изменениях в web.config, запускающих переработку IIS, я отредактировал следующие параметры appPool, чтобы отслеживать ситуацию за кулисами;

appPool-->Advanced Settings-->Recycling-->Disable Recycling for Configuration Changes = False
appPool-->Advanced Settings-->Recycling-->Generate Recycle Event Log Entry-->[For Each Setting] = True

С этой комбинацией настроек, если этот процесс должен был вызвать перезагрузку appPool, запись записи журнала должна быть записана, а это не так.

Это приводит меня к выводу, что это возможно , и действительно безопасно загружать настройки приложений с централизованного носителя данных.

Следует отметить, что я использую IIS7.5 в Windows 7. Код будет развернут в IIS8 на Win2012. Если что-либо изменит этот ответ, я соответствующим образом обновлю ответ.

12
ответ дан Sage 22 August 2018 в 20:45
поделиться
Другие вопросы по тегам:

Похожие вопросы: