MVC中的错误过滤器无法拦截URL路径错误的解决办法

“/”应用程序中的服务器错误。


无法找到资源。

说明: HTTP 404。您正在查找的资源(或者它的一个依赖项)可能已被移除,或其名称已更改,或暂时不可用。请检查以下 URL 并确保其拼写正确。

请求的 URL: /sdf



版本信息: Microsoft .NET Framework 版本:4.0.30319; ASP.NET 版本:4.0.30319.1

//--------------------------------------------------------------------------------------------------------------------------------------------

MVC中,有一个Filter可以捕捉错误,但是它的用法是利用Attribute来实现的,而且只能加在Controller和Action上,所以不能捕捉别出的错误

其实理论上所有的错误肯定产生于Controller中,但有2种情况下,就不会被捕捉了

1、页面不存在的时候,找不到对应的Controller,那没有任何Controller被执行,所以自然也不会捕捉到错误了

2、在 IAuthorizationFilter 下发生错误的时候,错误捕捉代码在IExceptionFilter中,而IAuthorizationFilter的优先权高于IExceptionFilter,所以也就捕捉不到了

[c-sharp] view plaincopy

  1. protected void Application_Error(object sender, EventArgs e)
  2. {
  3. Exception exception = Server.GetLastError();
  4. Response.Clear();
  5. HttpException httpException = exception as HttpException;
  6. RouteData routeData = new RouteData();
  7. routeData.Values.Add("controller", "Error");
  8. if (httpException == null)
  9. {
  10. routeData.Values.Add("action", "Index");
  11. }
  12. else //It‘s an Http Exception, Let‘s handle it.
  13. {
  14. switch (httpException.GetHttpCode())
  15. {
  16. case 404:
  17. // Page not found.
  18. routeData.Values.Add("action", "HttpError404");
  19. break;
  20. case 500:
  21. // Server error.
  22. routeData.Values.Add("action", "HttpError500");
  23. break;
  24. // Here you can handle Views to other error codes.
  25. // I choose a General error template
  26. default:
  27. routeData.Values.Add("action", "General");
  28. break;
  29. }
  30. }
  31. // Pass exception details to the target error View.
  32. routeData.Values.Add("error", exception.Message);
  33. // Clear the error on server.
  34. Server.ClearError();
  35. // Call target Controller and pass the routeData.
  36. IController errorController = new WEB.Controllers.ErrorController();
  37. errorController.Execute(new RequestContext(
  38. new HttpContextWrapper(Context), routeData));
  39. }

把这段代码放到 Global.asax 中,并且新建一个 Controller 叫做 Error

[c-sharp] view plaincopy

  1. namespace MVC.Controllers
  2. {
  3. public class ErrorController : Controller
  4. {
  5. public ActionResult Index(string error)
  6. {
  7. ViewData["Title"] = "WebSite 网站内部错误";
  8. ViewData["Description"] = error;
  9. return View("Index");
  10. }
  11. public ActionResult HttpError404(string error)
  12. {
  13. ViewData["Title"] = "HTTP 404- 无法找到文件";
  14. ViewData["Description"] = error;
  15. return View("Index");
  16. }
  17. public ActionResult HttpError500(string error)
  18. {
  19. ViewData["Title"] = "HTTP 500 - 内部服务器错误";
  20. ViewData["Description"] = error;
  21. return View("Index");
  22. }
  23. public ActionResult General(string error)
  24. {
  25. ViewData["Title"] = "HTTP 发生错误";
  26. ViewData["Description"] = error;
  27. return View("Index");
  28. }
  29. }
  30. }

这样,就可以捕捉所有错误了。

但其实,这样也不是完美的,因为如果你参考了我第一个问题中,在IIS6下不修改IIS设置,运行了MVC,那当后缀名不是.aspx的时候,错误不会被捕捉

因为这时候输入的地址根本没有交给网站来处理,IIS直接抛出了错误,因为IIS认为这个后缀名不是你所能执行的.

时间: 2024-10-06 17:36:08

MVC中的错误过滤器无法拦截URL路径错误的解决办法的相关文章

Asp.Net MVC中请求json文件时返回404 not found的解决办法

在web.config目录下添加 <system.webServer> <staticContent> <mimeMap fileExtension=".json" mimeType="application/json; charset=UTF-8" /> </staticContent> </system.webServer> 答案来自http://stackoverflow.com/questions/

Windows Server 2008 R2中IIS7.5配置完网站权限不足问题的解决办法:

Windows Server 2008 R2中IIS7.5配置完网站权限不足问题的解决办法:常见问题:HTTP 错误 500.0 - Internal Server Error无法显示页面,因为发生内部服务器错误.模块 IsapiModule 通知 ExecuteRequestHandler 处理程序 AboMapperCustom-20607 错误代码 0x800700c1 请求的 URL http://localhost:80/index.php 物理路径 D:\wwwroot\777t\i

在windows server 2008中安装SQL Server 2008 R2 1433端口未启用解决办法

SQL Server 一般默认的端口为 1433 ,但有时会遇到无法连接端口1433的问题,检查端口1433是否启用的方法为: 开始–>输入cmd –>回车–>telnet localhost 1433->回车   出现黑屏,表示本机连接端口1433成功. 或者 开始–>输入cmd –>回车–>netstat -an | find "1433"->回车 出现1433端口,表示本机1433端口开放. 我本次安装过程中遇到的问题:1433端口

problem中Project&#39;XX&#39;is missing required library:&#39;[路径]\XXX.jar&#39;解决方法

起因: 今天在接手同事做的一个项目时,发现用Myeclipse部署后,项目里有不少网页出现红叉,逐个修改完后,项目理应不再显示红叉,但奇怪的是,项目所有的子文件都没错误,项目根目录却有个红叉...>_<!同时Myeclipse下的problem中出现一堆error,提示:Project ‘XXX’ is missing required library:'[path] \ XXX.jar'. 解决: 出现这种情况的原因是:在你项目的build path Library中存在重复并且冲突或者地址

cvs提交错误:&#39;Committing resources&#39; has encountered a problem 解决办法-------程序员没有解决不了的错误

利用cvs提交项目时项目提交是一个空文件夹,报错如下: 删除这个项目分享是,报错: 原因:这是文件系统不同步的问题,是因为在eclipse或mycelipse之外对工程中的resource进行修改引起的(或者是由不同的系统间对文件进行修改引起的): 解决办法:上传前和更新前都刷新一下工程,右键项目名---->Refresh 这个问题拖了几天没有得到解决,本来以为没有办法解决了 ,看来程序员是没有解决不了的问题啊,哈哈哈  cvs提交错误:'Committing resources' has

Tortoise-SVN 出现“unable to connect to a repository at url no element found”解决办法

安装要SVN server服务器后,建立自己的Repositories,创建自己的项目文件夹 如,https://xxxxxxxxxx.com:8443/ 安装Tortoise-svn进行设置目标链接时,出现问题unable to connect to a repository at url no element found 解决办法: 最后加上svn就ok了

【转】Android中引入第三方Jar包的方法(java.lang.NoClassDefFoundError解决办法)

原文网址:http://www.blogjava.net/anchor110/articles/355699.html 1.在工程下新建lib文件夹,将需要的第三方包拷贝进来.2.将引用的第三方包,添加进工作的build path.3.(关键的一步)将lib设为源文件夹.如果不设置,则程序编译可以通过,但运行的时候,会报: java.lang.NoClassDefFoundError # re: Android中引入第三方Jar包的方法(java.lang.NoClassDefFoundErro

Word2010中搜狗拼音输入法(各种输入法)消失了的解决办法

Word2010中搜狗拼音输入法(各种输入法都会消失)消失了 ,现象就是怎么按快捷键,一直都是英文状态. 原因:是我在安装搜狗时,把输入法的中文美式键盘给删了 解决方法:把输入法的中文美式键盘给删了,加回去就好了. Word2010中搜狗拼音输入法(各种输入法)消失了的解决办法

js文件在IDEA中没有了格式,显示的是纯文本的解决办法

添加个Patterns就行了,名字为*.js js文件在IDEA中没有了格式,显示的是纯文本的解决办法