Я использую свою собственную фабрику контроллеров в приложении 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 (моя пользовательская страница ошибок) и некоторые изображения в определенной папке.
Поэтому я последовал совету этого поста и попытался решить проблемы путем игнорирования маршрутов в 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
...
);
}
Как я уже упоминал в комментариях, это устранило многие ошибки. Проблема, с которой я столкнулся, заключается в том, что когда я запускаю приложение, мне сразу же показывают экран смерти 404, сообщая, что моя пользовательская страница ошибки не может быть найдена. Детали ошибки:
System.Web.HttpException (0x80004005): файл /Error.aspx не существует.
в System.Web.UI.Util.CheckVirtualFileExists (VirtualPath virtualPath)
в System.Web.Compilation.BuildManager.GetVPathBuildResultInternal (VirtualPath virtualPath, логический noBuild, логический allowCrossApp, логический allowBuildInPrecompile, логический throwIfNotFound, логический sureIsUpToDate)
в System.Web.Compilation.BuildManager.GetVPathBuildResultWithNoAssert (контекст HttpContext, VirtualPath virtualPath, логический noBuild, логический allowCrossApp, логический allowBuildInPrecompile, логический throwIfNotFound, Boolean гарантировать)
в System.Web.Compilation.BuildManager.GetVirtualPathObjectFactory (VirtualPath virtualPath, контекст HttpContext, логическое allowCrossApp, логическое throwIfNotFound)
в System.Web.Compilation.BuildManager.CreateInstanceFromVirtualPath (VirtualPath virtualPath, введите requiredBaseType, контекст HttpContext, логическое allowCrossApp)
в System.Web.UI.PageHandlerFactory.GetHandlerHelper (контекст HttpContext, строковый requestType, виртуальный путь VirtualPath, физический путь строки)
в System.Web.UI.PageHandlerFactory.System.Web.IHttpHandlerFactory2.GetHandler (контекст HttpContext, String requestType, VirtualPath virtualPath, String PhysicalPath)
в System.Web.HttpApplication.MapHttpHandler (контекст HttpContext, String requestType, путь VirtualPath, String pathTranslated, логическое значение useAppConfig)
в System.Web.HttpApplication.MapHandlerExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute ()
в System.Web.HttpApplication.ExecuteStep (шаг IExecutionStep, логическое и завершено синхронно)
И раздел веб-конфигурации:
<system.web>
<customErrors mode="On" defaultRedirect="Error.aspx" />
...
</system.web>
Страница ошибок работала просто отлично, прежде чем я внес изменения в маршрутизацию. Если я закомментирую путь / content / images - приложение снова будет работать (хотя я вернулся к «Контроллер пути {0}» не найден или он не реализует ошибки IController). При комментировании маршрута favicon или allaspx эта ошибка 404 не меняется.
Любая помощь будет принята с благодарностью.
Приветствия
Тим.