2010-09-13 10 views
17

Mam podstawową witrynę ASP.NET MVC2, która rejestruje pojedynczy błąd "Plik nie istnieje" za każdym razem, gdy załadowany jest widok (nie widoki częściowe). Jestem prawie pewien, że dzieje się tak dlatego, że odwołuję się do pliku ze strony wzorcowej, który nie istnieje, ale nie wiem, który to jest.Jak rozwiązać wyjątek "Plik nie istnieje"?

Śledzenie stosu jest nieprzydatne (patrz poniżej). Czy ktoś ma jakieś wskazówki, jak najlepiej to debugować?

File does not exist. : at System.Web.StaticFileHandler.GetFileInfo(String virtualPathWithPathInfo, String physicalPath, HttpResponse response) 
    at System.Web.StaticFileHandler.ProcessRequestInternal(HttpContext context) 
    at System.Web.DefaultHttpHandler.BeginProcessRequest(HttpContext context, AsyncCallback callback, Object state) 
at System.Web.HttpApplication.CallHandlerExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute() 
at System.Web.HttpApplication.ExecuteStep(IExecutionStep step, Boolean& completedSynchronously) 
+0

Czy widzisz widok z perspektywy 404? Jeśli tak, użyj debugera trasy Phila Haacka (http://haacked.com/archive/2008/03/13/url-routing-debugger.aspx). Jeśli to nie jest twój problem, pokaż niektóre z kodu, które mogą być istotne. –

+0

Witaj Tomas, dzięki za komentarz! Nie, nie dostaję 404. Istnieje wyjątek podniesiony (System.Web.HttpException), który jest przechwytywany przez Application_Error() w moim Global.asax.cs. Nie ma wewnętrznego wyjątku. Nie wiem skąd pochodzi wyjątek. Mogę opublikować kod "logging" z Application_Error() - ale wszystko, co robi, to zrzucenie komunikatu wyjątku i śledzenia stosu do pliku tekstowego. –

Odpowiedz

55

Jak można powiedzieć, jego prawdopodobnie brakuje pliku lub obrazu odwołuje swojej stronie głównej. Aby uchwycić ten błąd, należy dodać następującą procedurę obsługi błędu do Global.asax

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

    if (ex.Message == "File does not exist.") 
    { 
     throw new Exception(string.Format("{0} {1}", ex.Message, HttpContext.Current.Request.Url.ToString()), ex); 
    } 
} 

Powinno to wtedy powiedzieć, co Resource strona żąda

+1

Dzięki Clicktricity! To genialnie proste. Sprawia, że ​​czuję się głupio, że o tym nie myślę :-) W każdym razie okazuje się, że jest to prośba o favicon.ico, która zawodzi. –

+2

Sprawdzałem ten problem przez cały wieczór. Dzięki za pomoc, mam plik, którego nie można znaleźć: favicon.ico. Jeszcze raz, wielkie dzięki. –

+0

Występuję z tym samym problemem, zrobiłem to i teraz otrzymuję: Plik nie istnieje. http: // localhost: 63456/ – Barka

5

Lub jeśli debugowania można po prostu umieścić następujący wiersz w oknie Immediate do sprawdź:

? HttpContext.Current.Request.Url.ToString()

+1

Tak, pomogło: System.Web.HttpContext.Current.Request.Url – Jonx

2

Sprawdź swoje pliki CSS pod kątem url (resource_path), gdzie "resource_path" nie istnieje.

Otrzymałem ten sam wyjątek. Znaleziony problem dotyczył pliku CSS, w którym brakowało obrazu w projekcie, a nie w systemie plików. Na przykład linia taka jak:

background-image: url(/images/foo.png); 

Gdzie plik "foo.png" nie znajduje się w folderze ze zdjęciami.

Można rzucić ostatni wyjątek jako HttpException aby uzyskać kod stanu HTML:

HttpException httpEx = Server.GetLastError() as HttpException; 
if(httpEx != null) 
    httpEx.GetHttpCode();   // Will be HTML status code, 404 in this case. 

Ale to nie zawiera żadnych informacji, co plik brakuje. Znalazłem brakujący plik, sprawdzając każdą deklarację klasy CSS na stronie, gdy wystąpił ten błąd.

+0

Mój był również CSS. Używam MVC 4 i musiałem przenieść moje @ Scripts.Render ... do _ViewStart.cshtml (Master Layout Page) zamiast _Layout.cshtml i to rozwiązało mój problem. – eaglei22

0

W moim przypadku wystąpił ten sam błąd, chociaż nie znalazłem żadnych "404 błędów" w konsoli przeglądarki. Sprawdziłem nawet plik główny i nie mogłem znaleźć żadnego pliku. Okazało się, że przeglądarka oczekuje, że favicon.ico znajdzie się w katalogu głównym witryny. Utworzyłem plik favicon.ico w katalogu głównym mojej witryny, a problem zniknął. Była to dobra strona do generowania ikonę: http://www.favicon.cc/

1

Dodaj następującą metodę w Global.asax pliku

protected void Application_Error(object sender, EventArgs e) 
{ 
    Exception ex = Server.GetLastError(); 
    Log.Error("An error occurred", ex); 
    Log.Error("Requested url: ", Request.RawUrl); 
} 

Request.RawUrl Podaj dokładny adres URL, który daje błąd.

Teraz w pliku logu powinien zobaczyć:

Requested url: /favicon.ico 
0

w moim przypadku był to brakujący domyślna strona domu tj default.aspx, który był sprawcą.

Dodanie pliku default.aspx rozwiązało problem.

Ten projekt nie wymaga jednak strony domyślnej, ponieważ nie jest to projekt skierowany do użytkownika.

To było więcej aplikacji middleware do łączenia starszych systemów w Internecie.

Powiązane problemy