在部署到IIS7時,MVC3報了一個找不到資源的錯誤,文件肯定是有的,而且頁面是肯定報錯的,也就說內部運行錯誤了,而MVC把錯誤沒有拋出來而已;
所以對症下葯,發覺我的項目里面用了rexs進行多語言,然后發現App_GlobalResources這里面的文件夾是空的,按道理來說,不應該是沒有文件才對。
所以我把App_GlobalResources文件夾重新上傳即可,問題解決。
以上是我的問題解決,以下我將介紹其它的類似的問題處理方法:
有時在程序運行的時候會出現“HTTP 404。您正在查找的資源(或者它的一個依賴項)可能已被移除,或其名稱已更改,或暫時不可用。請檢查以下 URL 並確保其拼寫正確。”的錯誤提示。
在這里我們以運行時打開登錄頁面(login)為例,
一般情況下分為兩種情況:
1、錯誤原因之:路由不正確。
解決方法:打開項目的“Global.asax”文件,找到路由注冊(RegisterRoutes()) 方法,並將其中的路由中的控制器更改為“Login”,就行了。action方法一般情況下是選擇為“Index”默認的方法(如圖所示),但可以根據自己的需要進行修改,此處不做演示。
2、錯誤原因之:選擇了視圖中的某一項為起始項。
解決方法:
(1)、右鍵選擇該項目屬性——找到web選項。這時你會發現,特定頁選項的值正是你設為起始頁的視圖名。
(2)、將特定頁的值設置為“login”或者“login/Index” (Index是默認的,可寫可不寫)。
(3)、運行項目。
MVC中,有一個Filter可以捕捉錯誤,但是它的用法是利用Attribute來實現的,而且只能加在Controller和Action上,所以不能捕捉別出的錯誤
其實理論上所有的錯誤肯定產生於Controller中,但有2種情況下,就不會被捕捉了
1、頁面不存在的時候,找不到對應的Controller,那沒有任何Controller被執行,所以自然也不會捕捉到錯誤了
2、在 IAuthorizationFilter 下發生錯誤的時候,錯誤捕捉代碼在IExceptionFilter中,而IAuthorizationFilter的優先權高於IExceptionFilter,所以也就捕捉不到了

protected void Application_Error(object sender, EventArgs e) { Exception exception = Server.GetLastError(); Response.Clear(); HttpException httpException = exception as HttpException; RouteData routeData = new RouteData(); routeData.Values.Add("controller", "Error"); if (httpException == null) { routeData.Values.Add("action", "Index"); } else //It's an Http Exception, Let's handle it. { switch (httpException.GetHttpCode()) { case 404: // Page not found. routeData.Values.Add("action", "HttpError404"); break; case 500: // Server error. routeData.Values.Add("action", "HttpError500"); break; // Here you can handle Views to other error codes. // I choose a General error template default: routeData.Values.Add("action", "General"); break; } } // Pass exception details to the target error View. routeData.Values.Add("error", exception.Message); // Clear the error on server. Server.ClearError(); // Call target Controller and pass the routeData. IController errorController = new WEB.Controllers.ErrorController(); errorController.Execute(new RequestContext( new HttpContextWrapper(Context), routeData)); }
把這段代碼放到 Global.asax 中,並且新建一個 Controller 叫做 Error

namespace MVC.Controllers { public class ErrorController : Controller { public ActionResult Index(string error) { ViewData["Title"] = "WebSite 網站內部錯誤"; ViewData["Description"] = error; return View("Index"); } public ActionResult HttpError404(string error) { ViewData["Title"] = "HTTP 404- 無法找到文件"; ViewData["Description"] = error; return View("Index"); } public ActionResult HttpError500(string error) { ViewData["Title"] = "HTTP 500 - 內部服務器錯誤"; ViewData["Description"] = error; return View("Index"); } public ActionResult General(string error) { ViewData["Title"] = "HTTP 發生錯誤"; ViewData["Description"] = error; return View("Index"); } } }
這樣,就可以捕捉所有錯誤了。
但其實,這樣也不是完美的,因為如果你參考了我第一個問題中,在IIS6下不修改IIS設置,運行了MVC,那當后綴名不是.aspx的時候,錯誤不會被捕捉
因為這時候輸入的地址根本沒有交給網站來處理,IIS直接拋出了錯誤,因為IIS認為這個后綴名不是你所能執行的.
以上內容如果有幫助,點個贊唄。