標籤:
客戶遷移到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\/(?<permissionid>(\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=(?<permissionid>\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配置增加到<system.webServer>配置節中.
此時的web.config中,在<system.web>下有httpModules和httpHandlers配置,<system.webServer>下有modules和handlers配置.
問題還是沒有解決,通過將增加了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 == 02015-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 == 02015-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 == 02015-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 == 02015-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 被調用
問題終於解決.
總結如下:
IIS7.5 404,將system.web中的httpModule註冊到system.webServer的modules,如果應用程式集區是傳統模式,module並沒有正確的啟用.會出現異常終止.
只有將應用程式集區切換到整合模式,並徹底剔除掉system.web的httpModules和httpHandlers配直節,才能夠正確啟用module.
IIS7.5 - HTTP 錯誤 404.0 - Not Found-0x80070002錯誤分析及解決方案