2013-02-11 56 views
4

标题说明了一切。实际上有很多关于如何做到这一点的信息,而且我非常接近。我读过关于谷歌几件事情,以及下面的计算器帖子:在运行IIS 6的ASP.NET MVC 3应用程序上处理404's

How can I properly handle 404 in ASP.NET MVC?

How can I properly handle 404 in ASP.NET MVC?

Custom error pages on asp.net MVC3

http://blog.davebouwman.com/2011/04/21/custom-404-pages-for-asp-net-mvc-3/

我有404的工作在操作层面。我在我的控制器上使用* .aspx后缀。如果您的网址类似于

"http://blahblah/AppName/idontexist.aspx" 

加载了自定义错误控制器。我的问题归结为没有.aspx并且不存在的控制器。这产生了典型的IIS服务器404 html页面,我不想要。作品中的另一个扭曲是我无法真正改变IIS配置本身。我必须通过代码/ web.config/global.asax(或者我没有想到的项目的其他部分)来处理这个问题。

这里是我的web.config项(这是根web.config,而不是视图中的一个):

<httpErrors defaultPath="/Error.aspx/HttpError" errorMode="Custom" existingResponse="Replace" defaultResponseMode="ExecuteURL"> 
    <remove statusCode="500" subStatusCode="-1" /> 
    <remove statusCode="404" subStatusCode="-1" /> 
    <error statusCode="500" path="/Error.aspx/HttpError" responseMode="ExecuteURL" /> 
    <error statusCode="404" path="/Error.aspx/NotFound" responseMode="ExecuteURL" /> 
</httpErrors> 

<customErrors mode="On" defaultRedirect="~/Error.aspx/HttpError"> 
    <error redirect="~/Error.aspx/NotFound" statusCode="404" /> 
</customErrors> 

这里是我的路线在Global.asax中:

 routes.MapRoute(
      "Default", // Route name 
      "{controller}.aspx/{action}/{id}", // URL with parameters 
      new { controller = "StartController", action = "StartAction", id = UrlParameter.Optional } // Parameter defaults 
     ); 

     routes.MapRoute(
      "NotFoundController", // Route name 
      "{controller}.aspx", // URL with parameters 
      new { controller = "Error", action = "NotFound" } // Parameter defaults 
     ); 

     routes.MapRoute(
      "NotFoundController2", // Route name 
      "{controller}", // URL with parameters 
      new { controller = "Error", action = "NotFound" } // Parameter defaults 
     ); 

     routes.MapRoute(
      "Root", // Route name 
      "", // URL with parameters 
      new { controller = "StartController", action = "StartAction", id = UrlParameter.Optional } // Parameter defaults 
     ); 

我还认为,使用路由来捕捉这些问题的一个障碍是我失去了404状态代码;然而,因为路线指向专门为此设计的行动,我想这一点是没有意义的。无论如何,任何想法,建议或批评都会受到欢迎。我在这里很亲密。谢谢!

编辑1

我仍然一直在研究这个。有没有一种方法可以定义自定义路由约束,如果在URL中找不到文本“.aspx”,它将重定向到错误控制器?

EDIT 2

看起来不像那是约束打算如何使用。我也试过在http://blog.davebouwman.com/2011/04/21/custom-404-pages-for-asp-net-mvc-3/实现按实施

protected void Application_Error() 
    { 
    } 

方法,但是当我不指定的.aspx的控制器,它看起来像应用程序从未得到机会抛出一个错误。它看起来像我的应用程序甚至可以响应它之前由IIS处理。

如果我可以进行IIS更改,最好只是该应用程序的虚拟目录条目,是否可以为此提供更可行的解决方案?

如果只有某处我可以抓取网址,搜索.aspx,并且如果找不到,则会抛出404找不到,但重定向到应用程序级别404页面而不是IIS默认值,这将会非常接近理想。

想法?

编辑3

我在处理这个场景仅仅是不可能的,除非你的应用是根网站IIS服务器,而不是一个虚拟目录的意见。我注意到,在IIS 6.0中,你可以调整默认的IIS错误页面。不仅如此,您可以用URL替换某些案例。我已经尝试使用虚拟目录网站执行此操作,但显示默认的IIS 404未找到页面。

所以它等于:如果您对安装程序有一个愚蠢的控制权限,并且您为此操作的站点是根站点,则可以在IIS 6上处理此问题。

不是很适用于我想象的真实场景。

+2

令人难以置信的404令人难以置信的404处理可以如何。 – 2013-02-11 16:25:54

+0

一些更多的帮助在这里.. http://www.devcurry.com/2012/06/aspnet-mvc-handling-exceptions-and-404.html – Amitd 2013-02-11 16:38:19

+0

这真的是相当惊人的。我怀疑这个应用程序的用户会去调整网址,但使用默认的IIS页面看起来并不专业。 – jason 2013-02-11 16:38:37

回答

1

我不认为这是可能的,但无法对IIS进行更改。在IIS 6中,请求不会进入ASP.Net领域,除非它们映射到ASP.Net ISAPI处理程序(aspnet_isapi.dll)。对于普通的ASP.Net扩展,当安装.Net(.ashx,.aspx等)时,映射已经在IIS6中设置。这就是为什么你的404不存在的控制器获得正常的IIS 404页面。 IIS正在查找磁盘上不存在的文件夹。

为了让您的404页面处理程序按预期工作(假设您可以对IIS进行更改),您需要设置所谓的wilcard映射。这将所有请求发送到ASP.Net ISAPI。还需要指示IIS绕过对物理文件的检查,因为在这种情况下都不存在。这个选项有一个复选框。我不再有IIS 6在我的面前,但是在这个网站选项1将引导您完成它:

http://blog.stevensanderson.com/2008/07/04/options-for-deploying-aspnet-mvc-to-iis-6/

我以前做过这个,它的工作。将所有内容发送到.Net ISAPI有一些权衡。所有静态文件将由ASP.Net(甚至图像)而不是直接处理IIS,因此只需注意其中的含义。

希望这会有所帮助

相关问题