ASP.net MVC - Use o Reflection para descobrir se existe um controlador

Estou tendo um tempo para descobrir como implementar corretamente meu redirecionamento 404.

Se eu usar o seguinte

<HandleError()> _
Public Class BaseController : Inherits System.Web.Mvc.Controller
''# do stuff
End Class

Qualquer erro não tratado na página carregará a visualização "Erro", que funciona muito bem.http://example.com/user/999 (onde 999 é um ID de usuário inválido) gera um erro ao manter o URL original (é isso que eu quero)

Contudo. Se alguém entrarhttp://example.com/asdfjkl no URL (onde asdfjkl é um controlador inválido), o IIS está lançando a página 404 genérica. (isto énão o que eu quero). O que eu preciso é que a mesma coisa acima se aplique. O URL original permanece e o controlador "NotFound" é carregado.

Estou registrando minhas rotas assim

Shared Sub RegisterRoutes(ByVal routes As RouteCollection)
    routes.RouteExistingFiles = False
    routes.IgnoreRoute("{resource}.axd/{*pathInfo}")
    routes.IgnoreRoute("Assets/{*pathInfo}")
    routes.IgnoreRoute("{*robotstxt}", New With {.robotstxt = "(.*/)?robots.txt(/.*)?"})

    routes.AddCombresRoute("Combres")

    routes.MapRoute("Start", "", New With {.controller = "Events", .action = "Index"})

    ''# MapRoute allows for a dynamic UserDetails ID
    routes.MapRouteLowercase("UserProfile", "Users/{id}/{slug}", _
                             New With {.controller = "Users", .action = "Details", .slug = UrlParameter.Optional}, _
                             New With {.id = "\d+"} _
    )


    ''# Default Catch All MapRoute
    routes.MapRouteLowercase("Default", "{controller}/{action}/{id}/{slug}", _
                             New With {.controller = "Events", .action = "Index", .id = UrlParameter.Optional, .slug = UrlParameter.Optional}, _
                             New With {.controller = New ControllerExistsConstraint})

    ''# Catch everything else cuz they're 404 errors
    routes.MapRoute("CatchAll", "{*catchall}", _
                    New With {.Controller = "Error", .Action = "NotFound"})

End Sub

Observe oControllerExistsConstraint? O que preciso fazer é usar o Reflection para descobrir se o controlador existe ou não.

Alguém pode me ajudar a preencher os espaços em branco?

Public Class ControllerExistsConstraint : Implements IRouteConstraint

    Public Sub New()
    End Sub

    Public Function Match(ByVal httpContext As System.Web.HttpContextBase, ByVal route As System.Web.Routing.Route, ByVal parameterName As String, ByVal values As System.Web.Routing.RouteValueDictionary, ByVal routeDirection As System.Web.Routing.RouteDirection) As Boolean Implements System.Web.Routing.IRouteConstraint.Match


        ''# Bah, I can't figure out how to find if the controller exists


End Class

Eu também gostaria de saber as implicações de desempenho disso ... qual é o desempenho pesado do Reflection? Se é demais, existe uma maneira melhor?

questionAnswers(4)

yourAnswerToTheQuestion