2016-02-12 4 views
0

ASP.NET MVC4 C# приложение web.config содержит настройки, какКак предотвратить дублирование AppSettings в web.config

<configuration> 
    <appSettings> 
    <add key="DefaultDataBase" 
     value="db1"/> 
    .. 

Метод

public static string DefaultDataBase 
{ 
    get 
    { 
     return WebConfigurationManager.AppSettings["DefaultDataBase"] ?? "mydefault"; 
    } 
} 

Используется, чтобы получить его в коде. Если web.config случайно содержит дубликат ключа как

<configuration> 
    <appSettings> 
    <add key="DefaultDataBase" 
     value="db1"/> 
    <add key="DefaultDataBase" 
     value="db2"/> 

    .. 

этот код молча Resturns неправильное значение db2

Как обнаружить дубликаты ключей и бросить ApplicationException на копиях?

+0

AppSettings имеет свойство Keys .... вы можете перебирать его и проверять ключ «DefaultDatabase», а если count больше одного, то у вас есть дубликаты ключей ... Я не уверен. Если для этого типа поддерживается LINQ-запрос ... но если это тогда, то запрос linq будет еще лучше – Viru

+0

_ «Как обнаружить» _ - проблема XY. Даже если вы сможете его обнаружить, это не решит проблему, так как ваше приложение не знает, какой из них использовать. Исправьте исходную проблему: используйте правильные методы развертывания, не редактируйте файлы конфигурации вручную. – CodeCaster

+0

Реальный файл appsettings файла web.config большой. Он содержит большое количество комментариев и множество настроек. Легко добавить некоторые повторяющиеся настройки. Я спросил, как делать тотальную ошибку, если в web.config есть повторяющиеся настройки. Редактирование мануалов удобно и быстро, не нужно менять это. – Andrus

ответ

0

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

Вы можете проверить дубликаты, прочитав web.config xml, используя, например, XmlReader (или другие методы). Но это не обычный механизм, поскольку файл конфигурации - это то, что должно быть изменено «ответственными» людьми.

+0

xml ручные разборки кажется слишком большой работой для этой маленькой задачи. Часть .NET читает файл web.config. Может быть, можно установить какое-то свойство, которое препятствует .NET переписывать свойство и вместо этого исключать исключение? Или переопределить некоторый метод чтения web.config? – Andrus

+1

Невозможно переопределить существующие методы. Но я придумал новую идею, вы можете создать пользовательский раздел конфигурации, как здесь: https://msdn.microsoft.com/pl-pl/library/2tw134k3.aspx?f=255&MSPPError=-2147217396, и тогда я думаю, что вы можете обнаружить в вашем классе, что есть дублированные записи. –

+0

Спасибо. Это отличная идея. В этом случае можно надеяться ограничить имена ключей и на предопределенный список имен. Где найти пример кода, который предотвращает дублирование в пользовательском разделе? Должен ли код в setter генерировать исключение, если ключ уже существует? – Andrus

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