لقد أخطأت .. الملف web.config إعادة الكتابة في وقت التشغيل ... لelmah

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

  •  06-07-2019
  •  | 
  •  

سؤال

ولقد أخطأت على العديد من المستويات. أنا على أمل شخص يمكن ان تقولوا لي أفضل طريقة لإعادة كتابة هذا ج #.

وأنا أعطيت مهمة لتعديل جزء من الملف web.config في وقت التشغيل لإزالة قطعة من هذا الموضوع لرسالة بريد إلكتروني خطأ elmah وأقحم اسم مربع.

والسبب في ذلك هو أننا لا نستطيع أن نثق اهلنا سم للحصول على هذه الحق اتساقا ولذا فإننا نضيع الوقت تصحيح الأخطاء على مربع الخطأ.

وحتى مع ذلك uglyness أمامي أنا بدأت الكتابة ...

وهنا هو المقطع في الملف 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();
}

ويمكن لأي شخص الحصول على حول إعراب السلسلة. حاولت الحصول عليه في صيغة إكس، ولكن الجرح لا يزال حتى سلسلة تحليل هذا الموضوع. هل هناك طريقة أفضل؟

شكرا،

واريك -

هل كانت مفيدة؟

المحلول

استخدم طريقة مصنع لخلق HttpHandler في وقت التشغيل بشكل حيوي. إنشاء البديل مخصصة للHTTPHandler التي تحتاجها كما ELMAH من ما أعرفه آخر مرة كنت تستخدم عبارة عن مجموعة من معالجات HTTP.

ونظرة على هذا المثال:

http://www.informit.com/articles/article .aspx اتصال؟ p = 25339 & seqNum = 5

نصائح أخرى

وتعديل 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);
}

وتحميل أنها XML وسحب الموضوع، ثم تحليل الموضوع مع String.Split مرتين، الأولى من قبل "،"، ثم كل السلسلة الناتجة التي كتبها ":". سوف تحصل على قائمة المصفوفات مثل:

والانقسام الأول: مجموعة مصفوفة 0 التطبيق: EditStaff_MVC 1 البيئة: ديف 2 ServerBoxName: AUST-DDEVMX90FF

والثانية (الداخلي) الانقسام: مجموعة مصفوفة 0 تطبيق 1 EditStaff_MVC

في الانقسام الثاني، إذا كانت القيمة الأولى هي ServerBoxName ثم كتابة القيمة الثانية مع MACHINENAME الخاص بك. إعادة بناء سلسلة كما تذهب.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top