Pergunta

pequei em tantos níveis. Eu estou esperando que alguém pode me dizer a melhor maneira de re-escrever esta c #.

Foi-me dada uma tarefa para modificar uma seção do web.config em tempo de execução para remover um pedaço do assunto para um e-mail de erro elmah e inserida o nome da caixa.

a razão é que não podemos confiar em nossos povos cm para obter estes direito consistantly e assim perdemos tempo de depuração de erros na caixa errada.

Então, com isso em frente uglyness de mim eu comecei a escrever ...

aqui é a seção no web.config Eu estou tentando modificar

 <elmah>
    <errorLog type="Elmah.XmlFileErrorLog, Elmah" logPath="~/ELMAH"  />
    <errorMail from="..." to="..."
      subject="Application: EditStaff_MVC,  Environment:Dev, ServerBoxName: AUST-DDEVMX90FF"
      async="true" />
  </elmah>

aqui está o código.

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();
}

Alguém pode obter em torno da análise de cadeia. Eu tentei chegar a ele como XML, mas ainda acabou seqüência de analisar o assunto. Existe uma maneira melhor?

Obrigado,

Eric -

Foi útil?

Solução

Use um método de fábrica para criar dinamicamente um HttpHandler em tempo de execução. Criar uma variante personalizada do HTTPHandler que você precisa como ELMAH pelo que eu sei última vez que usei é um conjunto de HTTP manipuladores.

Veja este exemplo:

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

Outras dicas

Modificar o XML de configuração em sons em tempo de execução como um pouco de um exagero para o que você gostaria. Em vez disso eu iria usar ganchos já incorporados ELMAH. Por exemplo, ELMAH dispara eventos quando enviar e-mails de erro. Eu recomendaria ler e-mails de erro do de personalização de elmah entrada do blog por Scott Mitchell para algum fundo. Você poderia escrever um manipulador para o evento Mailing em sua Global.asax para manipular a linha de assunto quando o e-mail tenha sido preparado, mas antes ELMAH envia-la para fora. Também gostaria de remendo a parte relevante do assunto usando Regex como demonstrado no exemplo a seguir (é mais robusto do que procurar a string, indexação e substituindo uma parte-se):

void ErrorMail_Mailing(object sender, Elmah.ErrorMailEventArgs args)
{
    args.Mail.Subject = 
        Regex.Replace(args.Mail.Subject, 
                      @"(?<=\bServerBoxName *: *)([_a-zA-Z0-9-]+)", 
                      Environment.MachineName);
}

carregá-lo como XML e sujeito puxar, em seguida, analisar o assunto com String.Split duas vezes, a primeira por "", em seguida, cada cadeia resultante de ':'. Você obterá uma lista de matrizes como:

Primeiro dividir: ordem 0 Aplicação: EditStaff_MVC 1 Ambiente: Dev 2 ServerBoxName: AUST-DDEVMX90FF

Em segundo lugar (interior) dividido: ordem 0 Aplicação 1 EditStaff_MVC

Na segunda divisão, se o primeiro valor é ServerBoxName então reescrever o segundo valor com o seu machineName. Reconstruir a string que você vá.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top