我犯了罪..Web.config在运行时重写...为elmah

时间:2009-07-30 21:40:18

标签: asp.net elmah

我犯了这么多级别的罪。我希望有人能告诉我一个更好的方法来重写这个c#。

我被赋予了一项任务,即在运行时修改web.config的一部分,以删除elmah错误电子邮件的主题部分并插入框名称。

原因是我们无法相信我们的cm人员能够始终如一地保持这些权利 所以我们浪费时间在错误的盒子上调试错误。

所以,在我开始写作之前,我开始写这个丑陋......

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

任何人都可以绕过字符串解析。我尝试将其作为xml,但仍然解析了主题的字符串。 还有更好的方法吗?

谢谢,

埃里克 -

3 个答案:

答案 0 :(得分:3)

使用Factory方法在运行时动态创建HttpHandler。根据我上次使用时所知的一组HTTP处理程序,创建一个您需要作为ELMAH的HTTPHandler的自定义变体。

看看这个例子:

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

答案 1 :(得分:3)

在运行时修改配置XML听起来有点像你想要的技术。相反,我会使用已经内置到ELMAH中的钩子。例如,ELMAH在发送错误邮件时触发事件。我建议您阅读Customizing ELMAH’s Error EmailsScott Mitchell博客条目以了解某些背景信息。您可以在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);
}

答案 2 :(得分:1)

将其加载为XML并拉取主题,然后使用String.Split两次解析主题,第一个用“,”解析,然后每个结果字符串用“:”解析。您将获得一个数组列表,如:

首先拆分: 排列 0应用程序:EditStaff_MVC 1环境:开发 2 ServerBoxName:AUST-DDEVMX90FF

第二次(内部)分裂: 排列 0申请 1 EditStaff_MVC

在第二次拆分时,如果第一个值是ServerBoxName,则使用machineName重写第二个值。你去的时候重建字符串。