Я согрешил..Перезапись Web.config во время выполнения… для elmah
Вопрос
Я согрешил на многих уровнях.Я надеюсь, что кто-нибудь подскажет мне лучший способ переписать этот C#.
Мне было поручено изменить раздел web.config во время выполнения, чтобы удалить часть темы электронного письма об ошибке elmah и вставить имя ящика.
Причина в том, что мы не можем доверять нашим людям CM, чтобы они были правильными постоянно, и поэтому мы тратим время на отладку ошибок на неправильном поле.
Итак, предвидя эту уродливость впереди, я начал писать...
вот раздел в web.config, который я пытаюсь изменить
<elmah>
<errorLog type="Elmah.XmlFileErrorLog, Elmah" logPath="~/ELMAH" />
<errorMail from="..." to="..."
subject="Application: EditStaff_MVC, Environment:Dev, ServerBoxName: AUST-DDEVMX90FF"
async="true" />
</elmah>
вот код.
private void UpdateElmahErrorEmailSubject( string appPath )
{
string machineName = System.Environment.MachineName;
//System.Collections.IDictionary config = ( System.Collections.IDictionary ) ConfigurationManager.GetSection( "elmah" ); ;
//System.Configuration.Configuration config2 = ( System.Configuration.Configuration ) ConfigurationManager.GetSection( "elmah/errorMail" );
System.Configuration.Configuration config = System.Web.Configuration.WebConfigurationManager.OpenWebConfiguration( appPath );
if ( config == null )
{
return;
}
ConfigurationSectionGroup sectionGroup = config.GetSectionGroup( "elmah" );
ConfigurationSection section = config.GetSection( "elmah/errorMail" );
// i was not able to get directly to the subject, so I had to write it as xml
string s = section.SectionInformation.GetRawXml();
string search = "ServerBoxName:";
//here is where i started to feel dirty, direct string parsing.
int startIndex = s.IndexOf( search );
int endIndex = s.IndexOf( "\"", startIndex );
string toReplace = s.Substring( startIndex, ( endIndex - startIndex ) );
s = s.Replace( toReplace, search + " " + machineName );
section.SectionInformation.SetRawXml( s );
config.Save();
}
может ли кто-нибудь обойти синтаксический анализ строк.Я пытался получить его как XML, но все равно получил строку, анализирующую тему.Есть ли способ лучше?
Спасибо,
Эрик-
Решение
Используйте метод Factory для динамического создания HttpHandler во время выполнения.Создайте собственный вариант HTTPHandler, который вам нужен как ELMAH. Насколько я знаю, в прошлый раз я использовал набор обработчиков HTTP.
Посмотрите на этот пример:
http://www.informit.com/articles/article.aspx?p=25339&seqNum=5
Другие советы
Изменение XML-файла конфигурации во время выполнения звучит как излишество в сравнении с тем, что вам хотелось бы.Вместо этого я бы использовал уже встроенные в ELMAH хуки.Например, ELMAH генерирует события при отправке сообщений об ошибках.Я бы рекомендовал прочитать Настройка электронных писем об ошибках ELMAH запись в блоге от Скотт Митчелл для некоторого фона.Вы можете написать обработчик для Mailing
событие в вашем Global.asax
чтобы манипулировать строкой темы, когда письмо подготовлено, но до того, как ELMAH его отправит.я бы тоже пластырь соответствующую часть предмета, используя Regex
как показано в следующем примере (это более надежно, чем поиск строки, индексирование и замена части самостоятельно):
void ErrorMail_Mailing(object sender, Elmah.ErrorMailEventArgs args)
{
args.Mail.Subject =
Regex.Replace(args.Mail.Subject,
@"(?<=\bServerBoxName *: *)([_a-zA-Z0-9-]+)",
Environment.MachineName);
}
Загрузите его как XML и извлеките тему, затем дважды проанализируйте тему с помощью String.Split, сначала по ",", затем каждую результирующую строку по ":".Вы получите список массивов, например:
Первый раскол:Массив 0 Приложение: EditStaff_mvc 1 Среда: Dev 2 ServerBoxName: Aust-DDEVMX90FF
Второй (внутренний) раскол:Массив 0 Приложение 1 editstaff_mvc
Во втором разделении, если первое значение — ServerBoxName, перезапишите второе значение на имя вашего компьютера.Восстанавливайте строку по ходу дела.