Frage

Ich habe auf so vielen Ebenen gesündigt. Ich hoffe, dass mir jemand einen besseren Weg, sagen kann, um diese c # neu zu schreiben.

mir eine Aufgabe gegeben wurde, einen Abschnitt der web.config zur Laufzeit zu ändern, um ein Stück des Themas für eine Elmah Fehler E-Mail zu entfernen und Einfügung des Box-Namen.

der Grund ist, können wir nicht unsere cm Leute vertrauen diese richtig zu machen consistantly und so vergeuden wir Zeit Fehler auf der falschen Box debuggen.

so mit, dass uglyness vor mir begann ich zu schreiben ...

Hier ist der Abschnitt in der web.config ich ändern bin versucht,

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

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

kann man rund um die Zeichenfolge-Analyse erhalten. Ich habe versucht, es als XML immer, aber immer noch gewickeltes String Parsen das Thema auf. Gibt es einen besseren Weg?

Danke,

Eric -

War es hilfreich?

Lösung

Verwenden Sie eine Factory-Methode, um dynamisch eine Httphandler zur Laufzeit zu erstellen. Erstellen Sie eine benutzerdefinierte Variante der Httphandler, den Sie als ELMAH müssen aus dem, was ich weiß, dass ich das letzte Mal verwendet eine Reihe von HTTP-Handlers ist.

Sehen Sie in diesem Beispiel:

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

Andere Tipps

Ändern der Konfiguration XML zur Laufzeit klingt wie ein bisschen zuviel des Guten für das, was Sie möchten. Stattdessen würde ich Haken bereits in ELMAH gebaut verwenden. Zum Beispiel feuert ELMAH Ereignisse, wenn fehlerhafte E-Mails zu senden. Ich würde empfehlen, die Customizing ELMAH der Fehler E-Mails zu lesen Blogeintrag von Scott Mitchell für einige Hintergrundinformationen. Sie könnten einen Handler für das Mailing Ereignis in Ihrem Global.asax schreiben die Betreffzeile zu manipulieren, wenn die E-Mail vorbereitet wurde, aber bevor ELMAH es aussendet. Ich würde auch Patch der relevante Teil des Motivs mit Regex wie im folgenden Beispiel gezeigt (es ist robuster als die Zeichenfolge, die Indizierung Suchen und Ersetzen eines Teils selbst):

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

Legen Sie es als XML und Subjekt ziehen, analysieren dann das Thema mit String.Split zweimal, das erste durch „“, dann wird jeder resultierende Zeichenfolge durch ‚:‘. Sie erhalten eine Liste von Arrays wie bekommen:

Erste Split: Feld 0 Anwendung: EditStaff_MVC 1 Umwelt: Dev 2 ServerBoxName: AUST-DDEVMX90FF

Zweite (innen) Split: Feld 0 Anwendung 1 EditStaff_MVC

Auf der zweiten Spalte, wenn der erste Wert ist ServerBoxName dann den zweiten Wert mit Ihrem machine umschreiben. Erstellen Sie die Zeichenfolge wie Sie gehen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top