Я согрешил ... Переписывание Web.config во время выполнения для elmah
https://stackoverflow.com/questions/1209559
Full question
вопрос
Я согрешил на многих уровнях. Я надеюсь, что кто-то может сказать мне лучший способ переписать этот c #.
Мне было дано задание изменить раздел web.config во время выполнения, чтобы удалить часть темы для сообщения об ошибке elmah и вставить имя поля.
причина в том, что мы не можем доверять нашим см см в правильном и поэтому мы тратим время на ошибки отладки не на той коробке.
так что с этим уродством впереди меня я начал писать ...
вот раздел в файле 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 р = 25339 & амп;? SEQNUM = 5 р>
ДРУГИЕ СОВЕТЫ
Изменение конфигурационного XML во время выполнения звучит немного излишне для того, что вы хотите. Вместо этого я бы использовал крюки, уже встроенные в ELMAH. Например, ELMAH генерирует события при отправке сообщений об ошибках. Я бы рекомендовал прочесть пользовательскую настройку ELMAH & # 8217 ; s Сообщения об ошибках в блоге Скотта Митчелла для получения дополнительной информации. Вы можете написать обработчик для события 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, перепишите второе значение с вашим machineName. Восстановите строку, как вы идете.