希望有人可以对我们遇到的这个问题有所了解,因为我在这里感到茫然。
首先,一点背景:
我重写了我们的应用程序的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()适用于我们应用程序中的其他任何地方,虽然我没有广泛使用 ,但我在应用程序的其他地方使用它非常成功。
答案 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]);
}