2011-08-25 11 views
12

Znalazłem tu inne pytanie, które stanowiło rozwiązanie pierwszej części mojego pytania, czyli jak wygenerować stronę 404 w ASP.NET MVC BEZ przekierowania do innej strony (więc pierwotnie żądany adres URL pozostaje w pasku adresu).Rzucanie 404 jak StackOverflow, bez przekierowania, podczas korzystania 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)); 

     } 
    } 

boczna 404 rzeczy działa dobrze dla mnie, gdybym nie używać IOCControllerFactory, ale jak tylko zrobić użyć fabryki, kod błędu nie jest w global.asax używany, a zamiast tego pojawia się następujący błąd:

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

Jak mogę obejść ten problem, bez uciekania się do pozbycia mojego controllerfactory i tworzenie konstruktora bez parametrów dla każdego z moim kontr ollers?

+0

patrz [ten post] (http://stackoverflow.com/questions/619895/how-can-i-properly-handle-404-in-asp-net-mvc/7967759#7967759), który jest przykładem niestandardowego rozwiązania strony błędu 404 przy użyciu atrybutów filtru ASP.Net MVC. To rozwiązanie pozwala również uniknąć przesyłania komunikatów 302/200 do przeglądarki. Przeglądarka otrzymuje odpowiedź 404. –

Odpowiedz

12

ASP.NET can do ten OOTB (od 3,5). na elemencie <CustomErrors> dodać: redirectMode=ResponseRewrite

Aktualizacja

Zamieściłem niewłaściwy kod. To właśnie obsługuje IIS 7.

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

To nie działa pod MVC, chociaż niestety, tylko formularze internetowe. Znalazłem inny artykuł na ten temat i wypróbowałem go, ale nie było dla MVC radości :( – marcusstarnes

+0

Kod, który wysłałem, był z jednego z moich własnych projektów ASP.NET MVC. Działa dobrze :) Testowano go przy użyciu usług IIS 7. Jakiego serwera WWW użyłeś do testowania? ? Nie jestem pewien, czy zadziała z wbudowanym deweloperem Visual Studio. serwer. –

+0

Po prostu wypróbowałem ten zaktualizowany kod jak wyżej (zarówno z dodatkowymi sekcjami customerrors, jak i bez niego w sekcji system.web), ale niestety nie udało się. Naprawdę dostaję 403 zabronione, gdy uderzę błąd, zamiast mojej niestandardowej strony błędu. Kiedy dodałem dodatkową sekcję customerrors do sekcji system.web, dała ona również 403, ale wspomniała o SSL (?!), ale sprawdzając moją konfigurację IIS7, nie mam włączonego SSL dla żadnej z tych aplikacji internetowych. Zmieszany! – marcusstarnes

Powiązane problemy