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

时间:2011-12-19 22:06:11

标签: c# asp.net url-rewriting

希望有人可以对我们遇到的这个问题有所了解,因为我在这里感到茫然。

首先,一点背景:

我重写了我们的应用程序的URL重写并在几周前实现了它。我使用Application_BeginRequest()文件中的global.asax进行了此操作,除了我做过的小疏忽之外,我们的应用程序一切正常。当我重写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()适用于我们应用程序中的其他任何地方,虽然我没有广泛使用 ,但我在应用程序的其他地方使用它非常成功。

2 个答案:

答案 0 :(得分:4)

不确定为什么ToLower会导致这种情况(我唯一可以想到的是它正在修改request.url,它将asp.net发送到狂热中),但有一个简单的解决方法:使用ignorecase比较而不是转换所有东西。

变化:

sPath.TrimStart('/').TrimEnd('/').Split('/')[0].Contains("reports")

为:

sPath.TrimStart('/').TrimEnd('/').Split('/')[0].IndexOf("reports",  StringComparison.InvariantCultureIgnoreCase) != -1

并删除您的ToLower逻辑。

答案 1 :(得分: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]);
      }