MVC 错误处理1
實(shí)例1.
/// <summary>/// 錯(cuò)誤處理/// 404 處理/// </summary>protected void Application_Error(object sender, EventArgs e){//判斷請(qǐng)求方式if (Request.HttpMethod == "GET"){// 獲取錯(cuò)誤HttpException exception = Server.GetLastError() as HttpException;if (exception != null){if (exception.GetHttpCode() == 404){//輸出指定的字符串 Response.Clear();//Response.Write("code:404");//輸出指定controller下的內(nèi)容RouteData routeData = new RouteData();routeData.Values.Add("controller", "ViewOne");routeData.Values.Add("action", "TempTwo");routeData.Values.Add("name", "zhangsan");IController one = new ViewOneController();one.Execute(new RequestContext(new HttpContextWrapper(Context), routeData));/** 如果不指定 結(jié)束輸出的話,則還是會(huì)執(zhí)行框架的自動(dòng)處理(會(huì)清空自己輸出的內(nèi)容)* 如果指定結(jié)束的話,狀態(tài)碼是200,而不是400,所以需要自己手動(dòng)指定狀態(tài)碼*/Response.StatusCode = 404;Response.End();Context.ClearError();}}}}?
實(shí)例2.
MVC中,有一個(gè)Filter可以捕捉錯(cuò)誤,但是它的用法是利用Attribute來(lái)實(shí)現(xiàn)的,而且只能加在Controller和Action上,所以不能捕捉別出的錯(cuò)誤
其實(shí)理論上所有的錯(cuò)誤肯定產(chǎn)生于Controller中,但有2種情況下,就不會(huì)被捕捉了
1、頁(yè)面不存在的時(shí)候,找不到對(duì)應(yīng)的Controller,那沒(méi)有任何Controller被執(zhí)行,所以自然也不會(huì)捕捉到錯(cuò)誤了
2、在 IAuthorizationFilter 下發(fā)生錯(cuò)誤的時(shí)候,錯(cuò)誤捕捉代碼在IExceptionFilter中,而IAuthorizationFilter的優(yōu)先權(quán)高于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 中,并且新建一個(gè) Controller 叫做 Error
namespace MVC.Controllers { public class ErrorController : Controller { public ActionResult Index(string error) { ViewData["Title"] = "WebSite 網(wǎng)站內(nèi)部錯(cuò)誤"; ViewData["Description"] = error; return View("Index"); } public ActionResult HttpError404(string error) { ViewData["Title"] = "HTTP 404- 無(wú)法找到文件"; ViewData["Description"] = error; return View("Index"); } public ActionResult HttpError500(string error) { ViewData["Title"] = "HTTP 500 - 內(nèi)部服務(wù)器錯(cuò)誤"; ViewData["Description"] = error; return View("Index"); } public ActionResult General(string error) { ViewData["Title"] = "HTTP 發(fā)生錯(cuò)誤"; ViewData["Description"] = error; return View("Index"); } } } 這樣,就可以捕捉所有錯(cuò)誤了。但其實(shí),這樣也不是完美的,因?yàn)槿绻銋⒖剂宋业谝粋€(gè)問(wèn)題中,在IIS6下不修改IIS設(shè)置,運(yùn)行了MVC,那當(dāng)后綴名不是.aspx的時(shí)候,錯(cuò)誤不會(huì)被捕捉
因?yàn)檫@時(shí)候輸入的地址根本沒(méi)有交給網(wǎng)站來(lái)處理,IIS直接拋出了錯(cuò)誤,因?yàn)镮IS認(rèn)為這個(gè)后綴名不是你所能執(zhí)行
?
?
特別標(biāo)注:
webconfig 需要配置輸出404的錯(cuò)誤的詳細(xì)信息
<system.webServer> <httpErrors errorMode="Detailed" /> </system.webServer>?
轉(zhuǎn)載于:https://www.cnblogs.com/tianma3798/p/4305207.html
總結(jié)
- 上一篇: iOS 深拷贝和浅拷贝
- 下一篇: 停止了IIS服务为什么apache还是启