He pecado. Web.config reescribiendo en tiempo de ejecución & # 8230; para elmah

StackOverflow https://stackoverflow.com/questions/1209559

  •  06-07-2019
  •  | 
  •  

Pregunta

He pecado en muchos niveles. Espero que alguien pueda decirme una mejor manera de volver a escribir este c #.

Me dieron la tarea de modificar una sección de web.config en tiempo de ejecución para eliminar una parte del asunto de un correo electrónico de error de elmah e insertar el nombre del cuadro.

la razón es que no podemos confiar en nuestros amigos de cm para hacer esto correctamente de manera consistente y entonces perdemos tiempo en la depuración de errores en el cuadro equivocado.

así que con esa fealdad por delante comencé a escribir ...

aquí está la sección en la web.config que estoy tratando de modificar

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

aquí está el 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();
}

¿alguien puede evitar el análisis de cadenas? Traté de llegar a él como xml, pero aún así terminé la secuencia analizando el tema. ¿Hay una mejor manera?

Gracias,

Eric-

¿Fue útil?

Solución

Use un método Factory para crear dinámicamente un HttpHandler en tiempo de ejecución. Cree una variante personalizada del HTTPHandler que necesita como ELMAH a partir de lo que sé que la última vez que usé es un conjunto de controladores HTTP.

Mira este ejemplo:

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

Otros consejos

Modificar el XML de configuración en tiempo de ejecución suena como una exageración para lo que desea. En cambio, usaría ganchos ya integrados en ELMAH. Por ejemplo, ELMAH dispara eventos cuando envía correos de error. Recomiendo leer el Personalizando ELMAH & # 8217 ; s Emails de error entrada del blog de Scott Mitchell para obtener más información. Puede escribir un controlador para el evento Mailing en su Global.asax para manipular la línea de asunto cuando se haya preparado el correo pero antes de que ELMAH lo envíe. También parchear la parte relevante del tema usando Regex como se demuestra en el siguiente ejemplo (es más robusto que buscar la cadena, indexar y reemplazar una porción usted mismo):

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

Cárguelo como XML y extraiga el asunto, luego analice el asunto con String.Split dos veces, el primero por ", " ;, luego cada cadena resultante por ": " ;. Obtendrá una lista de matrices como:

Primera división: Formación 0 Aplicación: EditStaff_MVC 1 Ambiente: Dev 2 ServerBoxName: AUST-DDEVMX90FF

Segunda división (interna): Formación 0 Solicitud 1 EditStaff_MVC

En la segunda división, si el primer valor es ServerBoxName, vuelva a escribir el segundo valor con su machineName. Reconstruya la cadena a medida que avanza.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top