Я согрешил .. Переписывание Web.config во время выполнения ... для Элмы - PullRequest
1 голос
/ 31 июля 2009

Я согрешил на многих уровнях. Я надеюсь, что кто-то может сказать мне лучший способ переписать этот 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, но все еще завел строку разбора темы. Есть ли лучший способ?

Спасибо

Eric-

Ответы [ 3 ]

3 голосов
/ 01 мая 2014

Изменение конфигурационного 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);
}
3 голосов
/ 31 июля 2009

Используйте метод Factory для динамического создания HttpHandler во время выполнения. Создайте пользовательский вариант HTTPHandler, который вам нужен как ELMAH, из того, что я знаю в прошлый раз, когда использовал набор обработчиков HTTP.

Посмотрите на этот пример:

http://www.informit.com/articles/article.aspx?p=25339&seqNum=5

1 голос
/ 31 июля 2009

Загрузите его как XML и извлеките тему, затем дважды проанализируйте тему с помощью String.Split, сначала «,», затем каждую полученную строку «:». Вы получите список массивов, таких как:

Первый сплит: массив 0 Приложение: EditStaff_MVC 1 Среда: Dev 2 ServerBoxName: AUST-DDEVMX90FF

Второй (внутренний) сплит: массив 0 приложений 1 EditStaff_MVC

Во втором разделении, если первое значение равно ServerBoxName, перезапишите второе значение с вашим machineName. Восстановите строку, как вы идете.

...