.net - practice - Detener excepción de ser lanzado por controlador inexistente
try catch web api (4)
Conecte una fábrica de controlador personalizado que pueda ejecutar sus funciones deseadas cuando no encuentre el controlador solicitado. Son solo unas pocas líneas de código, nada demasiado doloroso.
Puede rodar su propia fábrica de controladores o utilizar una de las muchas bibliotecas como punto de partida. Tendrás una clase que implemente IControllerFactory y dentro de la función CreateController () será tu lógica personalizada.
Ok, entonces estoy perplejo sobre este tema. He visto muchas cosas que se supone que resolverán este problema, pero no recibo una resolución que pueda cumplir con mis requisitos.
Estoy usando ELMAH para registrar excepciones y obtengo esta excepción cuando una URL con un controlador no válido o un controlador adecuado y una acción no válida.
System.Web.HttpException: The controller for path ''/BadController'' was not found or does not implement IController.
at System.Web.Mvc.DefaultControllerFactory.GetControllerInstance(RequestContext requestContext, Type controllerType)
at System.Web.Mvc.DefaultControllerFactory.CreateController(RequestContext requestContext, String controllerName)
at System.Web.Mvc.MvcHandler.ProcessRequestInit(HttpContextBase httpContext, IController& controller, IControllerFactory& factory)
at System.Web.Mvc.MvcHandler.BeginProcessRequest(HttpContextBase httpContext, AsyncCallback callback, Object state)
at System.Web.Mvc.MvcHandler.BeginProcessRequest(HttpContext httpContext, AsyncCallback callback, Object state)
at System.Web.Mvc.MvcHandler.System.Web.IHttpAsyncHandler.BeginProcessRequest(HttpContext context, AsyncCallback cb, Object extraData)
at System.Web.HttpApplication.CallHandlerExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute()
at System.Web.HttpApplication.ExecuteStep(IExecutionStep step, Boolean& completedSynchronously)
Quiero evitar que esta excepción sea lanzada. Estoy usando errores personalizados y funcionan bien, ya que la aplicación se enviará a mi página personalizada de error 404. Sin embargo, la excepción aún se registra.
Tengo el atributo [HandleError]
decora todos los controladores. es posible? Y si es así, agradecería cualquier ayuda.
Lo he intentado, estableciendo una ruta final que redirige , pero está haciendo coincidir una ruta anterior a esa por cualquier motivo. Intenté utilizar un httpModule y borrar en el evento Application_Error
del archivo Global.asax
. Nada está deteniendo esas excepciones.
Gracias de nuevo por cualquier ayuda!
Cree un RouteConstraint, que comprueba si el controlador existe (de hecho, escanea todos los controladores posibles al principio y lo almacena en caché, ya sabe a qué me refiero) y lo agrega a su ruta estándar.
Entonces, cuando tienes una solicitud a un controlador incorrecto, no es aceptada por la ruta normal. pero luego aceptado por el catchall -> ruta 404 ...
Probablemente no estaba retransmitiendo mi problema correctamente, después de que se supone que se lanzarán toneladas de excavaciones alrededor de esta excepción. La respuesta es excluir esas excepciones de ELMAH, según este artículo .
Por defecto, ELMAH registra los detalles de cada excepción no controlada, incluidos 404 y otros errores HTTP. Puede indicar a ELMAH que ignore estos u otros tipos de errores mediante el filtrado de errores.
Uso DSO''s ITCloud Contrib . Ninguno de esos parámetros genéricos {controller}/{action}
. UrlRoute
explícitos de UrlRoute
para cada método de acción. Me gusta ver las restricciones de los parámetros directamente sobre el método.