Asp.net 我犯了罪。。运行时重新编写Web.config…用于elmah

Asp.net 我犯了罪。。运行时重新编写Web.config…用于elmah,asp.net,elmah,Asp.net,Elmah,我犯了很多罪。我希望有人能告诉我一个更好的方法来重写这个c 我的任务是在运行时修改web.config的一部分,删除一封elmah错误电子邮件的主题,并插入框名 原因是我们不能相信我们的cm人员能够始终如一地正确处理这些问题 因此,我们浪费时间调试错误框上的错误 所以在我面前的丑陋面前我开始写作 这是我试图修改的web.config中的部分 <elmah> <errorLog type="Elmah.XmlFileErrorLog, Elmah" logPath="~

我犯了很多罪。我希望有人能告诉我一个更好的方法来重写这个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>
任何人都可以绕过字符串解析。我尝试将其作为xml,但仍然以字符串解析主题而告终。 有更好的办法吗

谢谢


Eric-

使用工厂方法在运行时动态创建HttpHandler。根据我上次使用的一组HTTP处理程序,创建一个定制的HTTPHandler变体,作为ELMAH使用

看看这个例子:


使用工厂方法在运行时动态创建HttpHandler。根据我上次使用的一组HTTP处理程序,创建一个定制的HTTPHandler变体,作为ELMAH使用

看看这个例子:


将其加载为XML并提取主题,然后用字符串解析主题。拆分两次,第一次拆分为“,”,然后将每个结果字符串拆分为“:”。您将得到如下数组列表:

第一次拆分: 排列 0应用程序:EditStaff\u MVC 1环境:开发 2 ServerBoxName:AUST-DDEVMX90FF

第二次(内部)拆分: 排列 0应用程序 1名编辑人员\u MVC


在第二次拆分时,如果第一个值是ServerBoxName,则使用machineName重写第二个值。在运行过程中重新生成字符串。

将其加载为XML并提取主题,然后使用字符串解析主题。拆分两次,第一次拆分为“,”,然后将每个结果字符串拆分为“:”。您将得到如下数组列表:

第一次拆分: 排列 0应用程序:EditStaff\u MVC 1环境:开发 2 ServerBoxName:AUST-DDEVMX90FF

第二次(内部)拆分: 排列 0应用程序 1名编辑人员\u MVC


在第二次拆分时,如果第一个值是ServerBoxName,则使用machineName重写第二个值。在运行时重新生成字符串。

在运行时修改配置XML听起来有点过分了。相反,我会使用ELMAH内置的挂钩。例如,ELMAH在发送错误邮件时触发事件。我建议你读一下作者的博客,了解一些背景知识。您可以在
Global.asax
中为
Mailing
事件编写一个处理程序,以便在邮件准备好但在ELMAH发出之前操作主题行。我还将使用
Regex
修补主题的相关部分,如下面的示例所示(它比搜索字符串、索引和自己替换部分更健壮):

void ErrorMail\u邮寄(对象发送者,Elmah.ErrorMailEventArgs args)
{
args.Mail.Subject=
Regex.Replace(args.Mail.Subject,

@"(?在运行时修改配置XML听起来有点过分。相反,我会使用ELMAH中已经内置的钩子。例如,ELMAH在发送错误邮件时触发事件。我建议您阅读一些背景资料。您可以在y中为
邮件
事件编写处理程序我们的
Global.asax
可以在邮件准备好后,但在ELMAH发出邮件之前操作主题行。我还可以使用
Regex
修补主题的相关部分,如下例所示(它比搜索字符串、索引和自己替换部分更健壮):

void ErrorMail\u邮寄(对象发送者,Elmah.ErrorMailEventArgs args)
{
args.Mail.Subject=
Regex.Replace(args.Mail.Subject,

@"(?你能将特定于服务器的值存储在服务器的machine.config中吗?你仍然需要信任你的cm人员,让他们做对,但一旦做对了,它就应该保持正确。唉,这一点是为了避免cm问题,所以这会减少它们,但不会删除它们。我不得不投票给你,只是为了代码的漂亮格式。Very nice.Aligned equals是一种真正的方法…你能将特定于服务器的值存储在服务器的machine.config中吗?你仍然需要信任你的cm人员来正确处理它,但一旦它正确了,它就应该保持正确。唉,整点都是为了避免cm问题,所以这会减少它们,但不会删除它们。我不得不向你投赞成票st用于漂亮的代码格式。非常好。对齐等于是一种真正的方式。。。
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();
}
void ErrorMail_Mailing(object sender, Elmah.ErrorMailEventArgs args)
{
    args.Mail.Subject = 
        Regex.Replace(args.Mail.Subject, 
                      @"(?<=\bServerBoxName *: *)([_a-zA-Z0-9-]+)", 
                      Environment.MachineName);
}