2014-10-16 9 views
9

Dziś rano obudziłem się odkrywając, że moja aplikacja internetowa MVC 4 na moim serwerze została uszkodzona.Aplikacje MVC łamią się po aktualizacji Windows z 15 października

Komunikat o błędzie jest:

An exception of type 'System.IO.FileNotFoundException' occurred in 
mscorlib.dll but was not handled in user code. 
Additional information: Could not load file or assembly 
'Newtonsoft.Json, Version=4.5.0.0, Culture=neutral, 
PublicKeyToken=30ad4fe6b2a6aeed' or one of its dependencies. 
The system cannot find the file specified. 

Otworzyłem mój projekt VS i prowadził ją z kodu (tak na innym komputerze), wystąpił ten sam błąd!

Sprawdziłem mój dziennik serwera i odkryłem, że aktualizacje zostały automatycznie zainstalowane o 5:06. Jedna z aktualizacji została wykonana przez pakiet instalacyjny AspNetMVC4.msi. Minutę później zaczęły pojawiać się pierwsze błędy w mojej aplikacji internetowej.

Na moim laptopie dla programistów ten sam instalator działał wczoraj (15 października) o 13:10:10.

Ten sam problem na obu komputerach.

Nigdy nie słyszałem o Newtonsoft.Json (ale teraz dowiedziałem się, co to jest). Wygląda na to, że jedna z bibliotek dll MVC (mało prawdopodobna) lub jedna z bibliotek dll (bardziej prawdopodobna) ma odniesienie do Newtonsoft.

Próbowałem wprowadzić Newtonsoft z nuget. To miał pewien wpływ, zmienił się błąd z FileNotFound do FileLoadException:

An exception of type 'System.IO.FileLoadException' occurred in 
mscorlib.dll but was not handled in user code Additional 
information: Could not load file or assembly 'Newtonsoft.Json, 
Version=4.5.0.0, Culture=neutral, PublicKeyToken=30ad4fe6b2a6aeed' 
or one of its dependencies. The located assembly's manifest 
definition does not match the assembly reference. (Exception 
from HRESULT: 0x80131040) 

Próbowałem też przejść z .NET 4.5 do 4.5.1. To nie pomogło.

BTW, błąd występuje w RegisterRoutes w Global.asax.cs:

routes.MapHttpRoute( 
    name: "DefaultApi", 
    routeTemplate: "api/{controller}/{id}", 
    defaults: new { id = RouteParameter.Optional } 
); 

pomysłów?

+1

Którą wersję zainstalowałeś za pomocą narzędzia nuGet, możesz wypróbować bindingRedirect, aby przekierować do nowej wersji, patrz http://msdn.microsoft.com/en-us/library/eftw1fys(v=vs.110).aspx – 3dd

+0

która wersja Newtonsoft.Json została zainstalowana? –

+0

Czy także powiązanie wiązania złożenia może rozwiązać ten problem? –

Odpowiedz

0

Musisz zainstalować Newtonsoft.Json 5.0.1 nupkg. BTW, jakiej wersji pliku System.Web.Http.dll używasz w swoim projekcie?

+0

Moja uwaga dotycząca tego problemu została usunięta, nie wiem dlaczego.Ważne jest dla ciebie i dla nas zrozumienie, dlaczego tak się stało. Podejrzewamy, że twoja aplikacja działa na przedpremierowej wersji MVC 4 (prawdopodobnie 4.0.20505.0), co jest ryzykowne, jeśli tak jest, powinieneś uaktualnić wersję MVC do obsługiwanej wersji 4. –

+0

Szczegółowe informacje na temat naprawy zabezpieczeń MVC problemy z łatkami zobacz ten wpis: http://blogs.msdn.com/b/webdev/archive/2014/10/16/microsoft-asp-net-mvc-security-update-broke-my-build.aspx –

1

Dziękuję wszystkim za dobre myśli! Próbowałem wykonać przekierowanie zespołu, ale nie działało.

Ostatecznie naprawiłem problem w bardzo prosty sposób. Nagle uświadomiłem sobie, że nigdy nie skorzystałem z poniższej trasy:

routes.MapHttpRoute( 
    name: "DefaultApi", 
    routeTemplate: "api/{controller}/{id}", 
    defaults: new { id = RouteParameter.Optional } 
); 

Usunąłem te linie i presto, wszystkie zadziałały ponownie!

Niektóre badania wykazały, że MapHttpRoute jest częścią starszej wersji System.Web.Mvc.dll, ale nie nowszej wersji. Tak więc nowa biblioteka dll jest niekompatybilna ze starszą wersją.

Ciągle niepokoi mnie to, że działająca, produkcyjna aplikacja internetowa zrywa się podczas snu przez aktualizację systemu Windows. Wyłączanie aktualizacji Windows może być rozwiązaniem, ale czyni serwer bardziej podatnym na ataki ... czym jest mądrość.

Jeszcze raz dziękuję wszystkim.

+0

Rozszerzenie MapHttpRoute jest w rzeczywistości częścią WebAPI, a nie MVC. Brak uaktualnionego odwołania do interfejsu WebAPI, ale z tym kodem, powodowałoby ten problem –

Powiązane problemy