2011-08-25 14 views
12

encontré otra pregunta publicada aquí que proporcionó una solución a la primera parte de mi pregunta, es decir, cómo generar una página 404 en ASP.NET MVC SIN redirigir a otra página (por lo que la url solicitada originalmente permanece en la barra de direcciones).Lanzando un 404 como StackOverflow, sin redirección, al usar IOCControllerFactory

ASP.NET MVC - How to throw a 404 page similar to that on StackOverflow

protected void Application_Error(object sender, EventArgs e) 
    { 
     var exception = Server.GetLastError(); 

     Response.Clear(); 
     var httpException = exception as HttpException; 
     var routeData = new RouteData(); 
     routeData.Values.Add("controller", "Error"); 

     if (httpException != null) 
     { 
      routeData.Values.Add("action", httpException.GetHttpCode() == 404 ? "NotFound" : "Unknown"); 

      // clear the error, otherwise, we will always get the default error page. 
      Server.ClearError(); 

      // call the controller with the route 
      IController errorController = new ErrorController(); 
      errorController.Execute(new RequestContext(new HttpContextWrapper(Context), routeData)); 

     } 
    } 

El lado 404 de cosas funciona bien para mí si yo no uso un IOCControllerFactory, pero tan pronto como lo hago utilizar una fábrica, el código de error en global.asax no es usado y en su lugar me sale el siguiente error:

The IControllerFactory 'MyNamespace.IOCControllerFactory' did not return a controller for the name 'blah'.

¿Cómo consigo alrededor de esto, sin recurrir a deshacerse de mi controllerfactory, y la creación de un constructor sin parámetros para cada uno de mi contr Ollers?

+0

Ver [este mensaje] (http://stackoverflow.com/questions/619895/how-can-i-properly-handle-404-in-asp-net-mvc/7967759#7967759), que es un ejemplo de una solución de página de error 404 personalizada que utiliza atributos de filtro ASP.Net MVC. Esta solución también evita los mensajes 302/200 en el navegador. El navegador obtiene una respuesta 404. –

Respuesta

12

ASP.NET can do este OOTB (a partir de 3.5). En el elemento <CustomErrors> añadir: redirectMode=ResponseRewrite

actualización

he publicado un código incorrecto. Es IIS 7 que maneja esto.

<system.webServer> 
    <httpErrors errorMode="Custom" existingResponse="Replace"> 
     <remove statusCode="404" /> 
     <error statusCode="404" path="/home/notfound" responseMode="ExecuteURL" /> 
    </httpErrors> 
<system.webServer> 
+0

Esto no funciona bajo MVC, aunque lamentablemente, solo los formularios web. Había encontrado otro artículo sobre esto y lo probé, pero no me gustó MVC :( – marcusstarnes

+0

El código que publiqué era de uno de mis propios proyectos ASP.NET MVC. Funciona bien :) Se probó usando IIS 7. Con qué servidor web probaste ? No estoy seguro de que funcione con el desarrollador de Visual Studio. servidor. –

+0

Acabo de probar este código actualizado como el anterior (tanto con y sin una sección de clientes adicionales en la sección system.web) pero desafortunadamente no tuve éxito. De hecho, recibo un 403 prohibido cuando respondo un error, en lugar de la página de error personalizada. Cuando agregué una sección de customerrors adicionales a la sección system.web, también dio 403 pero mencioné SSL (?!), pero revisé mi configuración de IIS7, no tengo SSL activado para ninguna de esta aplicación web. ¡Confuso! – marcusstarnes

Cuestiones relacionadas