Asp.net应用迁移到IIS7.5 时,站点报告 HTTP 错误 404.0 - Not Found 错误。处理过程如下:
运行环境:Framework 2.0,IIS7.5,Web站点一套,没有源代码,应用程序池默认为经典模式.
报错页面的URL如下:http://localhost/HL2008/UI/AutoMonitor/135?autorun=true
看到这个URL地址,第一反应就是HttpModule被重写了,通过.net reflector 7.0 反编译HL2008.Web.Common.dll,发现UrlRewriter类,实现了System.Web.IHttpModule接口.
继续跟踪,这个类的核心代码就是一个跳转操作.
void context_BeginRequest(object sender, EventArgs e)
{
//string path = string.Format("~/Action/RequestHandler.aspx?id={0}&{1}","yeyang",HttpContext.Current.Request.RawUrl);
//HttpContext.Current.RewritePath(path,false);
ILog log = log4net.LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);
log.Info("DemoHttpModule context_BeginRequest 被调用");
string p = string.Empty;
//if (GlobalDefine.IsAutoMon(out p))
if (IsAutoMon(out p))
{
log.Info("DemoHttpModule context_BeginRequest -GlobalDefine.IsAutoMon == true 被调用");
string path = string.Format("~/UI/AutoMonitor/AutoMonitorBasePage.aspx?id={0}&{1}", p, HttpContext.Current.Request.QueryString);
HttpContext.Current.RewritePath(path, false);
}
else
{
log.Info("DemoHttpModule context_BeginRequest -GlobalDefine.IsAutoMon == false 被调用");
}
}
public static bool IsAutoMon(out string PermissionId)
{
PermissionId = GetPermissionId();
return !string.IsNullOrEmpty(PermissionId);
}
public static string GetPermissionId()
{
return GetPermissionId(HttpContext.Current.Request.RawUrl);
}
public static string GetPermissionId(string url)
{
ILog log = log4net.LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);
log.Info("DemoHttpModule GetPermissionId 被调用");
log.Info(string.Format("Url 地址是[{0}]", url));
string PermissionId = string.Empty;
MatchCollection mc = new Regex(@"\/UI\/AutoMonitor\/(?(\d+))(($)|(\?\S+))", RegexOptions.IgnoreCase).Matches(url);
if (mc.Count > 0)
{
return mc[0].Groups["permissionid"].Value;
}
log.Info("在第一个正则匹配之后:mc.Count == 0");
mc = new Regex(@"/UI/AutoMonitor/AutoMonitorBasePage.aspx\?id=(?\d+)", RegexOptions.IgnoreCase).Matches(url);
if (mc.Count > 0)
{
PermissionId = mc[0].Groups["permissionid"].Value;
}
return PermissionId;
}
因此初步判定为HttpModule没有被激活,通过网页搜索,找到一篇相近的博文(http://q.cnblogs.com/q/38592/),其中提到IIS7.5下 httpModules 使用出现:404 求解决,需要将modules配置增加到
此时的web.config中,在
问题还是没有解决,通过将增加了log4net日志的modules组件插接到原有应用程序中输出的日志来分析,应用程序在没有激活http://localhost/HL2008/UI/AutoMonitor/135?autorun=true这个请求之前就已经终止了.日志如下:
- DemoHttpModule context_BeginRequest 被调用
2015-01-12 12:41:37,010 [4084] INFO Demo.DemoHttpModule [(null)] <(null)>
- DemoHttpModule GetPermissionId 被调用
2015-01-12 12:41:37,010 [4084] INFO Demo.DemoHttpModule [(null)] <(null)>
- Url 地址是[/HL2008/UI/Security/Main.aspx/FocusHashCode]
2015-01-12 12:41:37,010 [4084] INFO Demo.DemoHttpModule [(null)] <(null)>
- 在第一个正则匹配之后:mc.Count == 0
2015-01-12 12:41:37,010 [4084] INFO Demo.DemoHttpModule [(null)] <(null)>
- DemoHttpModule context_BeginRequest -GlobalDefine.IsAutoMon == false 被调用
2015-01-12 12:42:01,313 [1276] INFO Demo.DemoHttpModule [(null)] <(null)>
- DemoHttpModule context_BeginRequest 被调用
2015-01-12 12:42:01,313 [1276] INFO Demo.DemoHttpModule [(null)] <(null)>
- DemoHttpModule GetPermissionId 被调用
2015-01-12 12:42:01,313 [1276] INFO Demo.DemoHttpModule [(null)] <(null)>
- Url 地址是[/HL2008/UI/Security/Main.aspx/FocusHashCode]
2015-01-12 12:42:01,313 [1276] INFO Demo.DemoHttpModule [(null)] <(null)>
- 在第一个正则匹配之后:mc.Count == 0
2015-01-12 12:42:01,313 [1276] INFO Demo.DemoHttpModule [(null)] <(null)>
- DemoHttpModule context_BeginRequest -GlobalDefine.IsAutoMon == false 被调用
2015-01-12 12:42:06,804 [4084] INFO Demo.DemoHttpModule [(null)] <(null)>
- DemoHttpModule context_BeginRequest 被调用
2015-01-12 12:42:06,804 [4084] INFO Demo.DemoHttpModule [(null)] <(null)>
- DemoHttpModule GetPermissionId 被调用
2015-01-12 12:42:06,804 [4084] INFO Demo.DemoHttpModule [(null)] <(null)>
- Url 地址是[/HL2008/UI/Security/Main.aspx/FocusHashCode]
2015-01-12 12:42:06,804 [4084] INFO Demo.DemoHttpModule [(null)] <(null)>
- 在第一个正则匹配之后:mc.Count == 0
2015-01-12 12:42:06,804 [4084] INFO Demo.DemoHttpModule [(null)] <(null)>
- DemoHttpModule context_BeginRequest -GlobalDefine.IsAutoMon == false 被调用
2015-01-12 12:42:11,921 [4084] INFO Demo.DemoHttpModule [(null)] <(null)>
- DemoHttpModule context_BeginRequest 被调用
2015-01-12 12:42:11,921 [4084] INFO Demo.DemoHttpModule [(null)] <(null)>
- DemoHttpModule GetPermissionId 被调用
2015-01-12 12:42:11,921 [4084] INFO Demo.DemoHttpModule [(null)] <(null)>
- Url 地址是[/HL2008/UI/Security/Main.aspx/FocusHashCode]
2015-01-12 12:42:11,921 [4084] INFO Demo.DemoHttpModule [(null)] <(null)>
- 在第一个正则匹配之后:mc.Count == 0
2015-01-12 12:42:11,921 [4084] INFO Demo.DemoHttpModule [(null)] <(null)>
- DemoHttpModule context_BeginRequest -GlobalDefine.IsAutoMon == false 被调用
于是问题就被定义为,modules被调用了,但是并没有激活http://localhost/HL2008/UI/AutoMonitor/135?autorun=true这个请求.
继续,将应用程序池设置为集成模式,这时候IIS错误如下:
HTTP 错误 500.22 - Internal Server Error
检测到在集成的托管管道模式下不适用的 ASP.NET 设置。
模块:ConfigurationValidationModule
通知:BeginRequest
处理程序:StaticFile
错误代码:0x80070032
关键的信息如下:
最可能的原因:此应用程序在 system.web/httpModules 节中定义配置。
于是剔除了system.web/httpModules配置节
发起请求,继续HTTP错误,关键信息如下:
?此应用程序在 system.web/httpHandlers 节中定义配置。
剔除system.web/httpHandlers配置节.
发起请求.日志内容如下:
2015-01-12 22:03:18,058 [6676] INFO Demo.DemoHttpModule [(null)] <(null)>
- DemoHttpModule init 被调用
2015-01-12 22:03:18,136 [6676] INFO Demo.DemoHttpModule [(null)] <(null)>
- DemoHttpModule context_BeginRequest 被调用
2015-01-12 22:03:18,136 [6676] INFO Demo.DemoHttpModule [(null)] <(null)>
- DemoHttpModule GetPermissionId 被调用
2015-01-12 22:03:18,136 [6676] INFO Demo.DemoHttpModule [(null)] <(null)>
- Url 地址是[/HL2008/UI/AutoMonitor/135?autorun=true]
2015-01-12 22:03:18,136 [6676] INFO Demo.DemoHttpModule [(null)] <(null)>
- DemoHttpModule context_BeginRequest -GlobalDefine.IsAutoMon == true 被调用
部署到生产环境后,发现框架页面的JQuery框架失效了.继续分析.发现框架页面使用到了ScriptManager控件,对应生成的Html代码形如: