J'ai péché .. réécriture de Web.config à l'exécution & # 8230; pour elmah

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

  •  06-07-2019
  •  | 
  •  

Question

J'ai péché à tant de niveaux. J'espère que quelqu'un pourra me dire un meilleur moyen de réécrire ce c #.

On m'a confié la tâche de modifier une section de web.config lors de l'exécution afin de supprimer un élément du sujet pour un courrier électronique d'erreur elmah et d'insérer le nom de la boîte.

la raison en est que nous ne pouvons pas faire confiance à nos collaborateurs de cm pour obtenir ces réponses correctement et nous perdons donc du temps en erreurs de débogage sur la mauvaise boîte.

donc avec cette laideur devant moi, j'ai commencé à écrire ...

voici la section du web.config que je tente de modifier

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

voici le code.

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

n'importe qui peut-il contourner l'analyse des chaînes. J'ai essayé d'obtenir en XML, mais toujours enroulé de chaîne en analysant le sujet. Y a-t-il un meilleur moyen?

Merci,

Eric -

Était-ce utile?

La solution

Utilisez une méthode Factory pour créer dynamiquement un HttpHandler au moment de l'exécution. Créez une variante personnalisée de HTTPHandler dont vous avez besoin comme ELMAH à partir de ce que je sais que la dernière fois que j'ai utilisé est un ensemble de gestionnaires HTTP.

Regardez cet exemple:

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

Autres conseils

La modification du code XML de configuration au moment de l’exécution semble un peu exagérée pour ce que vous voudriez. J'utiliserais plutôt des crochets déjà intégrés à ELMAH. Par exemple, ELMAH déclenche des événements lors de l'envoi de mails d'erreur. Je recommanderais de lire le Personnalisation d'ELMAH & # 8217 ; s Messages d'erreur dans le blog par Scott Mitchell pour vous donner un aperçu. Vous pouvez écrire un gestionnaire pour l'événement Mailing dans votre Global.asax afin de manipuler la ligne de sujet lorsque le courrier a été préparé mais avant que ELMAH ne l'envoie. Je voudrais aussi corriger la partie pertinente du sujet en utilisant Regex comme illustré dans l'exemple suivant (il est plus robuste que de rechercher la chaîne, d'indexer et de remplacer une partie vous-même):

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

Chargez-le au format XML et extrayez le sujet, puis analysez le sujet avec String.Split deux fois, le premier par ",", puis chaque chaîne résultante par "::". Vous obtiendrez une liste de tableaux comme:

Première division: Tableau 0 Application: EditStaff_MVC 1 environnement: Dev 2 ServerBoxName: AUST-DDEVMX90FF

Deuxième division (interne): Tableau 0 application 1 EditStaff_MVC

Sur le deuxième groupe, si la première valeur est ServerBoxName, réécrivez la deuxième valeur avec votre nom de machine. Reconstruisez la chaîne au fur et à mesure.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top