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