Global中的lower().asax Application_BeginRequest峰值CPU和轰炸应用程序
本文关键字:CPU 峰值 应用程序 BeginRequest lower 中的 Application asax Global | 更新日期: 2023-09-27 18:18:15
希望有人能给我们这个问题一些启示,因为我在这里不知所措。
首先介绍一下背景:
我为我们的应用重写了URL重写,并在几周前实现了它。我使用global.asax
文件中的Application_BeginRequest()
完成了这个操作,除了我犯的一个小疏忽之外,我们的应用程序一切都很好。当我重写url时,我只是检查用户请求的路径中是否存在某些关键字,然后相应地重写路径。非常直接的东西,这里没有发明轮子。干代码,真的。但是,我要检查的文本都是小写的,而路径可能会有不同的大小写。
string sPath = Request.Url.ToString();
sPath = sPath.Replace(Request.Url.Scheme + "://", "")
.Replace(Request.Url.Host, "");
if (sPath.TrimStart('/').TrimEnd('/').Split('/')[0].Contains("reports") && sPath.TrimStart('/').TrimEnd('/').Split('/').Length > 2) {
string[] aVariables = sPath.TrimStart('/').TrimEnd('/').Split('/');
Context.RewritePath("/app/reports/report-logon.aspx?iLanguageID=" + aVariables[1] + "&sEventCode=" + aVariables[2]);
}
…如果有人以/Reports/的形式输入页面,规则将不匹配,结果将收到404错误。
很容易修复,虽然,我认为。只需要将请求的路径字符串强制为小写,以便我尝试匹配的任何内容都将查看请求路径的小写版本,并在上述情况下成功匹配。所以我将代码调整为:
string sPath = Request.Url.ToString();
sPath = sPath.Replace(Request.Url.Scheme + "://", "")
.Replace(Request.Url.Host, "");
sPath = sPath.ToLower(); // <--- New line
if (sPath.TrimStart('/').TrimEnd('/').Split('/')[0].Contains("reports") && sPath.TrimStart('/').TrimEnd('/').Split('/').Length > 2) {
string[] aVariables = sPath.TrimStart('/').TrimEnd('/').Split('/');
Context.RewritePath("/app/reports/report-logon.aspx?iLanguageID=" + aVariables[1] + "&sEventCode=" + aVariables[2]);
}
有了这个修复,当我请求任何与URL重写相匹配的URL时,服务器上的CPU峰值达到100%,我的整个应用程序崩溃。我取出.ToLower()
,杀死应用程序池,应用程序又完全正常了。
我在这里错过了什么吗?到底发生了什么事?为什么这样一个简单的方法会导致应用程序崩溃?. tolower()可以在应用程序的其他地方工作,尽管我没有广泛使用它,但我在应用程序的其他地方使用它非常成功。
不确定为什么ToLower会导致这种情况(我唯一能想到的是它正在修改请求)。Url,这会使asp.net陷入疯狂),但有一个简单的修复方法:使用忽略递增比较,而不是将所有内容转换为以下内容。
改变:
sPath.TrimStart('/').TrimEnd('/').Split('/')[0].Contains("reports")
:
sPath.TrimStart('/').TrimEnd('/').Split('/')[0].IndexOf("reports", StringComparison.InvariantCultureIgnoreCase) != -1
虽然我不能说为什么。tolower()使您的服务器崩溃
为什么不试试indexOf
if (sPath.TrimStart('/').TrimEnd('/').Split('/')[0].IndexOf("reports",StringComparison.InvariantCultureIgnoreCase)>=0 && sPath.TrimStart('/').TrimEnd('/').Split('/').Length > 2)
{
string[] aVariables = sPath.TrimStart('/').TrimEnd('/').Split('/');
Context.RewritePath("/app/reports/report-logon.aspx?iLanguageID=" + aVariables[1] + "&sEventCode=" + aVariables[2]);
}