找不到MVC路由和自定义错误页面问题

时间:2011-07-06 01:03:02

标签: asp.net-mvc-2 asp.net-mvc-routing

我在MVC 2应用程序中使用自己的控制器工厂,这个标准代码似乎正在进行中:

    protected override IController GetControllerInstance(RequestContext reqContext, Type controllerType)
    {
        ...

        // Error handling
        if (controllerType == null)
        {
            throw new HttpException(
                404, String.Format(
                    "The controller for path '{0}' could not be found" +
                    " or it does not implement IController.",
                    reqContext.HttpContext.Request.Path
                    )
                );
        }

        ...
    }

我遇到的问题是其他人问过的问题,这个错误处理逻辑和我的ELMAH捕获的某些资源已经被数百个无意义错误填充。更令人讨厌的是,它使调试变得痛苦,必须保持F5错误。这些资源是:favicon.ico,Error.aspx(我的自定义错误页面),以及特定文件夹中的一些图像。

所以我遵循this帖子的建议,试图通过忽略global.asax中的路由来解决问题:

    public static void RegisterRoutes(RouteCollection routes)
    {
        routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
        routes.IgnoreRoute("elmah.axd");
        routes.IgnoreRoute("/Content/images/{*pathinfo}"); // This has succesfully rid me of a bunch of errors
        routes.IgnoreRoute("{*favicon}", new { favicon = @"(.*/)?favicon.([iI][cC][oO]|[gG][iI][fF])(/.*)?" }); // This has successfully rid me of the favicon error
        routes.IgnoreRoute("{*allaspx}", new { allaspx = @"(.*/)?.aspx(/.*)?" }); // NOT SURE OF THIS ONE

        ...

        );
    }

正如我在评论中提到的,这已经清除了许多错误。我现在的问题是,当我启动应用程序时,我是immediatley给出了404死亡屏幕,告诉我我的自定义错误页面无法找到。错误详情:

  

System.Web.HttpException(0x80004005):文件'/Error.aspx'不存在。      在System.Web.UI.Util.CheckVirtualFileExists(VirtualPath virtualPath)      在System.Web.Compilation.BuildManager.GetVPathBuildResultInternal(VirtualPath virtualPath,Boolean noBuild,Boolean allowCrossApp,Boolean allowBuildInPrecompile,Boolean throwIfNotFound,Boolean ensureIsUpToDate)      at System.Web.Compilation.BuildManager.GetVPathBuildResultWithNoAssert(HttpContext context,VirtualPath virtualPath,Boolean noBuild,Boolean allowCrossApp,Boolean allowBuildInPrecompile,Boolean throwIfNotFound,Boolean ensureIsUpToDate)      在System.Web.Compilation.BuildManager.GetVirtualPathObjectFactory(VirtualPath virtualPath,HttpContext context,Boolean allowCrossApp,Boolean throwIfNotFound)      在System.Web.Compilation.BuildManager.CreateInstanceFromVirtualPath(VirtualPath virtualPath,Type requiredBaseType,HttpContext context,Boolean allowCrossApp)      在System.Web.UI.PageHandlerFactory.GetHandlerHelper(HttpContext context,String requestType,VirtualPath virtualPath,String physicalPath)      在System.Web.UI.PageHandlerFactory.System.Web.IHttpHandlerFactory2.GetHandler(HttpContext context,String requestType,VirtualPath virtualPath,String physicalPath)      at System.Web.HttpApplication.MapHttpHandler(HttpContext context,String requestType,VirtualPath path,String pathTranslated,Boolean useAppConfig)      在System.Web.HttpApplication.MapHandlerExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute()      在System.Web.HttpApplication.ExecuteStep(IExecutionStep step,Boolean& completedSynchronously)

网页配置部分:

<system.web>
   <customErrors mode="On" defaultRedirect="Error.aspx" />

   ...
</system.web>

在我对路由进行更改之前,错误页面工作正常。如果我注释掉/ content / images路径 - 应用程序再次工作(虽然我回到“无法找到路径'{0}的控制器',或者它没有实现IController”错误)。评论favicon或allaspx路线对此404错误没有任何改变。

非常感谢任何帮助。

干杯,

2 个答案:

答案 0 :(得分:0)

问题是设置错误页面错误。

我回到了最开始,this教程。我没有ErrorController并且正在使用HandleError属性。按照此链接中的说明修复了错误页面的问题。忽略为favicon工作的路线的答案。其他文件真的丢失了文件。

答案 1 :(得分:0)

我们收到了相同的错误消息,但问题不同,我们传递的可选参数包含/字符,这会导致应用程序查找不同的路由。因此,请确认您的参数不包含/字符。