2011-08-25 7 views
12

Ho trovato un'altra domanda pubblicata qui che forniva una soluzione alla prima parte della mia domanda, cioè come generare una pagina 404 in ASP.NET MVC SENZA reindirizzamento in un'altra pagina (quindi l'url originariamente richiesto rimane nella barra degli indirizzi).Lanciare un 404 come StackOverflow, senza reindirizzamento, quando si utilizza 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)); 

     } 
    } 

Il lato 404 delle cose funziona bene per me, se io non uso un IOCControllerFactory, ma non appena ho faccio utilizzare una fabbrica, il codice di errore in global.asax non è usati e invece io ottenere il seguente errore:

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

Come faccio ad avere intorno a questo, senza ricorrere a sbarazzarsi della mia ControllerFactory, e la creazione di un costruttore senza parametri per ciascuno dei miei contr Ollers?

+0

Sede [questo post] (http://stackoverflow.com/questions/619895/how-can-i-properly-handle-404-in-asp-net-mvc/7967759#7967759), che è un esempio di una soluzione di pagina di errore 404 personalizzata che utilizza gli attributi di filtro ASP.Net MVC. Questa soluzione evita anche i messaggi 302/200 nel browser. Il browser ottiene una risposta 404. –

risposta

12

ASP.NET can do questo OOTB (a partire da 3.5). Sull'elemento <CustomErrors> aggiungere: redirectMode=ResponseRewrite

Aggiornamento

ho postato il codice errato. È IIS 7 che gestisce questo.

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

Questo non funziona in MVC, ma sfortunatamente solo moduli web. Ho trovato un altro articolo su questo e l'ho provato, ma nessuna gioia per MVC :( – marcusstarnes

+0

Il codice che ho postato proviene da uno dei miei progetti MVC ASP.NET. Funziona bene :) È testato usando IIS 7. Che server web hai testato con ? Non sono sicuro che funzionerà con lo sviluppatore integrato di Visual Studio. server. –

+0

Ho appena provato questo codice aggiornato come sopra (entrambi con e senza una sezione customerrors aggiuntiva nella sezione system.web) ma purtroppo non ci sono riusciti. In realtà ottengo un 403 vietato quando prendo un errore, invece della mia pagina di errore personalizzata. Quando ho aggiunto una sezione customerrors aggiuntiva alla sezione system.web, ho dato anche 403 ma ho menzionato SSL (?!), ma controllando la mia configurazione IIS7, non ho attivato SSL per nessuna di questa applicazione web. Confuso! – marcusstarnes

Problemi correlati