Расширение Web.config в ASP.NET приложении

8 Авг
2011

Стояла задача собрать диагностические данные со всех серверов нашей компании. Структура сети у нас такая, что есть мастер сервера (ведущие сервера), и у каждого мастер сервера, есть несколько сегмент серверов (ведомых). Для сбора информации нужно было опросить все сервера включительно, и для этого запросить у всех мастер серверов, информацию о его сегментах. Для решения задачи, необходимо было где то хранить информацию о всех мастер серверах, и делать это так чтобы ее было легко модифицировать, для этого было принято решение хранить ее в web.config, предварительно расширить структуру web.config, для хранения необходимых структур данных. В Web.config уже предусмотрен элемент , в который можно добавлять пары значения ключ, но этот подход имеет несколько существенных недостатков, а именно нет возможности хранить структурированную информацию, такую как списки, или параметры. И он не гибкий для работы с разными типами данных, так как работает только со строками. Конечно можно было, бы сериализовать структуру в строку, или просто использовать разделители между параметрами, и потом соответственно десериализоватьи или «распарсить», но такие подходы портят читаемость, и идею с легкой модификацией. К счастью есть возможность расширить web.config с помощью произвольного XML, после этого можно создать специализированный класс, который сможет читать и преобразовывать эту информацию. Начнем: Пишем, необходимую нам структуру, в web.config в секции к примеру так,
1
<app id='3' net='1' master='#'></app>
где «app» – название нового элемента, а остальные поля, это необходимых нам параметры. Теперь необходимо зарегистрировать этот новый элемент web.config, если не зарегистрировать новый элемент ASP.NET приложение откажется запускаться, так как обнаружит не распознанные разделы. Для регистрации нового элемента, необходимо дописать такой код в web.config
<configSections>
<section name='app' type='ApplicationsDto'></section>
</configSections>
Добавляя в , новые , вы регистрируете новый элемент, и привязываете его к типу данных, соответственно поле name – название нового элемента, а поле type — указывает на тип данных, к которому привязан этот элемент. Теперь создаем сам тип, в который будем хранить извлеченную информацию. Этот тип должен обязательно быть насследован от ConfigurationSection;
[ConfigurationProperty("id",DefaultValue=false)]
publiclongId
{
get{return(long)base["id"];}
set{base["id"]=value;}
}
[ConfigurationProperty("net",DefaultValue=false)]
publiclongNetId
{
get{return(long)base["net"];}
set{base["net"]=value;}
}
[ConfigurationProperty("master",DefaultValue=false)]
publicstringMasterUrl
{
get{return(string)base["master"];}
set{base["master"]=value;}
}
Этот класс для каждого поля нашего нового элемента, имеет строго типизированое свойство, через которые мы будем обращаться к необходимым полям. Информация извлекается с помошбю атрибута, которые мы установили для каждого нашего свойства. Теперь у нас есть, новый элемент в web.config, и тип данных для хранения. Остается третий заключительный шаг, получить данные: Для получения данных нам необходимо указать директорию в которой хранится web.config, и вытянуть необходимую секцию.
var config = WebConfigurationManager.OpenWebConfiguration(Request.ApplicationPath);
var masterInfo = (ApplicationDto) config.GetSection("app");
Плюсы такого подхода очевидны, данные легко модифицировать вручную, и при модификации web.config, будет автоматически происходить переинициализация всего приложения, а это значит, что приложение сразу «увидет» новые данные. PS: Элементы и поля, в web.config, обязательно должны начинаться с маленькой буквы.
По материалам Хабрахабр.



загрузка...

Комментарии:

Наверх