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()可以在应用程序的其他地方工作,尽管我没有广泛使用它,但我在应用程序的其他地方使用它非常成功。

Global中的lower().asax Application_BeginRequest峰值CPU和轰炸应用程序

不确定为什么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]);
      }