InvalidCastException jest generowany po zainstalowaniu ASP.NET MVC 4 Beta

81

Po zainstalowaniu ASP.NET MVC 4 Beta na komputerze z ASP.NET MVC 3 pojawia się następujący wyjątek.

Wyjątek System.InvalidCastException nie został obsłużony przez kod użytkownika. Message = [A] System.Web.WebPages.Razor.Configuration.HostSection nie może zostać przesłany do [B] System.Web.WebPages.Razor.Configuration.HostSection. Typ A pochodzi z „System.Web.WebPages.Razor, Version = 1.0.0.0, Culture = neutral, PublicKeyToken = 31bf3856ad364e35” w kontekście „Default” w lokalizacji „C: \ Windows \ Microsoft.Net \ assembly \ GAC_MSIL \ System .Web.WebPages.Razor \ v4.0_1.0.0.0__31bf3856ad364e35 \ System.Web.WebPages.Razor.dll '. Typ B pochodzi z „System.Web.WebPages.Razor, Version = 2.0.0.0, Culture = neutral, PublicKeyToken = 31bf3856ad364e35” w kontekście „Default” w lokalizacji „C: \ Windows \ Microsoft.Net \ assembly \ GAC_MSIL \ System .Web.WebPages.Razor \ v4.0_2.0.0. 0__31bf3856ad364e35 \ System.Web.WebPages.Razor.dll '. Źródło = System.Web.WebPages.Razor

Ślad stosu:

at System.Web.WebPages.Razor.WebRazorHostFactory.GetRazorSection (String virtualPath) w System.Web.WebPages.Razor.WebRazorHostFactory.CreateHostFromConfig (String virtualPath, String physicalPath) at System.Web.WebPages.Razor.Razor.Build () System.Web.WebPages.Razor.RazorBuildProvider.CreateHost () w System.Web.WebPages.Razor.RazorBuildProvider.EnsureGeneratedCode () w System.Web.WebPages.Razor.RazorBuildProvider.get_CodeCompiler.WebProvider. GetCompilerTypeFromBuildProvider (BuildProvider buildProvider) w System.Web.Compilation.BuildProvidersCompiler.ProcessBuildProviders () w System.Web.Compilation.BuildProvidersCompiler.PerformBuild () w System.Web.Compilation.BuildManager.CompileWebFile (ścieżka_wirtualna ścieżka_wirtualna) w System.Web.Compilation.BuildManager.GetVPathBuildResultInternal (ścieżka_wirtualna ścieżka_wirtualna, logicznej noBuild, logicznej allowCrossApp, logicznej allowBuildInPrecompile, logicznej throwIfNotFound, logiczna ensureIsUpToDate) w System.Web.Compilation.BuildManager.GetVPathBuildResultWithNoAssert (HttpContext kontekście ścieżka_wirtualna ścieżka_wirtualna , Boolean noBuild, Boolean allowCrossApp, Boolean allowBuildInPrecompile, Boolean throwIfNotFound, Boolean secureIsUpToDate) at System.Web.Compilation.BuildManager.GetVirtualPathObjectFactory (VirtualPath virtualPath, Boolean secureIsUpToDate) at System.Web.Compilation.BuildManager.GetVirtualPathObjectFactory (VirtualPath virtualPath, Boolean secureIsUpToDate) w System.Web.Compilation.BuildManager.GetVirtualPathObjectFactory (VirtualPath virtualPath, Boolean secureIsUpToDate) Web.Mvc.IBuildManager.FileExists (String virtualPath) w System.Web.Mvc.BuildManagerViewEngine.FileExists (ControllerContext controllerContext, String virtualPath) w System.Web.Mvc.VirtualPathProviderViewEngine.GetPathFromGeneralName (ControllerContext controllerContext, List`1 location, String name, String controllerName, String areaName, String cacheKey, String [] &earchLocations) w System.Web. Mvc.VirtualPathProviderViewEngine.GetPath (ControllerContext controllerContext, String [] locations, String [] areaLocations, String locationsPropertyName, String name, String controllerName, String cacheKeyPrefix, Boolean useCache, String [] &earchLocations) at System.Web.Mvc.VindtualView (ControllerContext controllerContext, String viewName, String masterName, Boolean useCache) w System.Web.Mvc.ViewEngineCollection. <> C__DisplayClassc.b__b (IViewEngine e) w System.Web.Mvc.ViewEngineCollection.Find (Func`2 lookup, Boolean trackSearchedPaths) at System.Web.Mvc.ViewEngineCollection.FindView (ControllerContext controllerContext, String viewName, String masterName) at System.Web.Mvc .ViewResult.FindView (kontekst ControllerContext) w System.Web.Mvc.ViewResultBase.ExecuteResult (kontekst ControllerContext) w System.Web.Mvc.ControllerActionInvoker.InvokeActionResult (ControllerContext controllerContext, ActionResult actionResult) w System.Web.Mvoker. c__DisplayClass1c.b__19 () w System.Web.Mvc.ControllerActionInvoker.InvokeActionResultFilter (filtr IResultFilter, ResultExecutingContext preContext, kontynuacja Func`1) w System.Web.Mvc.ControllerActionInvoker. <> c__cDisplay. <Class.> c__DisplayClass1e.b__1b () w System.Web.Mvc.ControllerActionInvoker.InvokeActionResultWithFilters (ControllerContext controllerContext, filtry IList`1, ActionResult actionResult) w System.Web.Mvc.ControllerActionResultWithFilters (ControllerContext controllerContext, filtry IList`1, ActionResult actionResult) w System.Web.Mvc.ControllerActionResultWithFilters (ControllerContext controllerContext, filtry IList`1, ActionResult actionResult) w System.Web.Mvc.ControllerActionInvoker.InvokeAction kontroler (ControllerCext). Mvc.Controller.ExecuteCore () w [project_namespace] .Controllers.GlobalizationController.ExecuteCore () w [file_path] w System.Web.Mvc.ControllerBase.Execute (RequestContext requestContext) w System.Web.Mvc.ControllerBase.System.Web. Mvc.IController.Execute (RequestContext requestContext) w System.Web.Mvc.MvcHandler. <> C__DisplayClass6. <> C__DisplayClassb.b__5 () at System.Web.Mvc.Async.AsyncResultWrapper. <> C__DisplayClass1. Web.Mvc.Async.AsyncResultWrapper. <> C__DisplayClass8`1.b__7 (IAsyncResult _) at System.Web.Mvc.Async.AsyncResultWrapper.WrappedAsyncResult`1.End () at System.Web.Mvc.MvcHandler. System. System.Web.Web.Mvc.Async.AsyncResultWrapper.WrappedAsyncResult`1.End () w System.Web.Mvc.MvcHandler. <> C__DisplayClasse.b__d () w System.Web.Mvc.SecurityUtil.b__0 (działanie f) w System.Web. Mvc.SecurityUtil.ProcessInApplicationTrust (akcja akcji) w System.Web.Mvc.MvcHandler.EndProcessRequest (IAsyncResult asyncResult) w System.Web.Mvc.MvcHandler.System.Web.IHttpAsyncHandsler.End.EndAequpl (wynik IHttpAsyncHandsler.End) CallHandlerExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute () w System.Web.HttpApplication.ExecuteStep (krok IExecutionStep, wartość logiczna i zakończonaSynchronicznie)Web.Mvc.Async.AsyncResultWrapper.WrappedAsyncResult`1.End () w System.Web.Mvc.MvcHandler. <> C__DisplayClasse.b__d () w System.Web.Mvc.SecurityUtil.b__0 (działanie f) w System.Web. Mvc.SecurityUtil.ProcessInApplicationTrust (akcja akcji) w System.Web.Mvc.MvcHandler.EndProcessRequest (IAsyncResult asyncResult) w System.Web.Mvc.MvcHandler.System.Web.IHttpAsyncHandsler.End.EndAequpl (wynik IHttpAsyncHandsler.End) CallHandlerExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute () w System.Web.HttpApplication.ExecuteStep (krok IExecutionStep, wartość logiczna i zakończonaSynchronicznie)b__0 (akcja f) w System.Web.Mvc.SecurityUtil.ProcessInApplicationTrust (akcja akcji) w System.Web.Mvc.MvcHandler.EndProcessRequest (IAsyncResult asyncResult) w System.Web.Mvc.MvcHandler.System.Webs.IHttcHandler.System.Webs.IHttroc IAsyncResult result) w System.Web.HttpApplication.CallHandlerExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute () w System.Web.HttpApplication.ExecuteStep (IExecutionStep krok, Boolean i zakończonoSynchronicznie)b__0 (akcja f) w System.Web.Mvc.SecurityUtil.ProcessInApplicationTrust (akcja akcji) w System.Web.Mvc.MvcHandler.EndProcessRequest (IAsyncResult asyncResult) w System.Web.Mvc.MvcHandler.System.Webs.IHttcHandler.System.Webs.IHttroc IAsyncResult result) w System.Web.HttpApplication.CallHandlerExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute () w System.Web.HttpApplication.ExecuteStep (IExecutionStep krok, Boolean & CompleteSynchronously)HttpApplication.IExecutionStep.Execute () at System.Web.HttpApplication.ExecuteStep (krok IExecutionStep, wartość logiczna i zakończonaSynchronicznie)HttpApplication.IExecutionStep.Execute () at System.Web.HttpApplication.ExecuteStep (krok IExecutionStep, wartość logiczna i zakończonaSynchronicznie)

To mnie całkowicie blokuje i chociaż chciałbym zachować wersję beta, być może będę musiał całkowicie ją usunąć, aby pozbyć się wyjątku.

Nikos Baxevanis
źródło
1
Czy masz przypadkiem .net 4.5 Dev Preview? (To jest niezgodne z obecną wersją Beta) (tak dla przypomnienia, czy ja nie przegłosowałem, pytanie jest uzasadnione)
Michael Stum
1
Nie, w ogóle nie uruchamiam 4.5.
Nikos Baxevanis
3
Poważnie, dlaczego głosowano w dół? Udzielam informacji zwrotnych na temat czegoś, co może się przydarzyć innym.
Nikos Baxevanis
@MichaelStum OK, nie martw się. :)
Nikos Baxevanis
Przepraszam za zamieszanie. Próbowałem "dodać do ulubionych" to pytanie i źle kliknąłem = P Głos przeciw został usunięty, tym razem ulubione zostało poprawnie dodane.
Josh Darnell

Odpowiedzi:

31

Spróbuj dodać następujące elementy w swoim pliku web.config:

<appSettings>
  <add key="webpages:Version" value="1.0.0.0"/>
</appSettings>

Problem może wynikać z rejestracji wielu dostawców kompilacji i ostatniej wygranej.

marcind
źródło
101

Miałem ten sam problem, ale podczas migracji ASP.NET MVC 3 do ASP.NET MVC 4. Tak dotarłem do tego tematu. Znalazłem rozwiązanie problemu, ale jego źródło jest inne, nie pochodzi z WebPageswersji.

Postępowałem zgodnie z oficjalnym przewodnikiem (że tak powiem) Uaktualnianie projektu ASP.NET MVC 3 do ASP.NET MVC 4 .

Aby rozwiązać problem, musisz dodać w Web.Config (prawdopodobnie wokół wcześniej dodanych):

<runtime><!-- Should be there by default, near end -->
    <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1"><!-- Should be there by default -->
    <dependentAssembly>..</dependentAssembly><!-- Should be there by default -->
        ... some other dependecy redirects ...

    <dependentAssembly>
        <assemblyIdentity name="System.Web.WebPages.Razor"
            publicKeyToken="31bf3856ad364e35" />
        <bindingRedirect oldVersion="1.0.0.0" newVersion="2.0.0.0"/>
    </dependentAssembly>

        ... some other dependency redirects ...
    </assemblyBinding>
</runtime>

Również w uwagach nie wspomniano o zmianie odniesienia do System.Web.Helpers z 1.0.0.0 na 2.0.0.0 (usuń i dodaj nowy).

Rolice
źródło
2
+1 Dzięki mnóstwo za udostępnienie. Jedną z drobnych zmian, które zrobiłem, było użycie oldVersion="1.0.0.0-2.0.0.0"tylko konwencji używanej w szablonie projektu MVC4. Co ciekawe, dependentAssemblyfor System.Web.WebPages.Razorjest również nieobecny w głównym pliku Web.config w szablonie projektu MVC4.
Scotty.NET,
1
Miałem podobny problem z aktualizacją pakietów NuGet MVC 4 do 5.1.1, rozwiązany powyższym, aleoldVersion="2.0.0.0" newVersion="3.0.0.0"
Luke Puplett
34

Jeszcze jedno, dość późne rozwiązanie ... Natknąłem się na ten sam problem. Wykonałem wszystkie wymienione tutaj poprawki (dziękuję wszystkim !!!), ale nie udało mi się obejść błędu. W końcu w desperacji znalazłem plik web.config w katalogu Views. W tym pliku znalazłem kilka odniesień do wersji System.Web.Mvc i podrzuciłem je wszystkie do wersji „4.0.0.0”. Co ważniejsze, znalazłem następujące wiersze i zaktualizowałem numery wersji dla „system.web.webPages.Razor” z „1.0.0.0” do „2.0.0.0” i nagle wszystko znów działało. Miejmy nadzieję, że pomoże to komuś innemu.

<sectionGroup name="system.web.webPages.razor" type="System.Web.WebPages.Razor.Configuration.RazorWebSectionGroup, System.Web.WebPages.Razor, Version=2.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35">
  <section name="host" type="System.Web.WebPages.Razor.Configuration.HostSection, System.Web.WebPages.Razor, Version=2.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" requirePermission="false" />
  <section name="pages" type="System.Web.WebPages.Razor.Configuration.RazorPagesSection, System.Web.WebPages.Razor, Version=2.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" requirePermission="false" />
</sectionGroup>

Steve G.

Steve G.
źródło
1
Nie zapomnij również o pliku web.config w obszarze Obszary / widoki, jeśli używasz obszarów.
Antonin Jelinek
5

Znalazłem inny sposób, aby to zadziałało, podobnie jak blog Tajwańczyka dotyczący aktualizacji z MVC 2 do MVC 3: http://blog.kkbruce.net/2011_04_01_archive.html (możesz użyć Tłumacza Microsoft w IE10, aby zobaczyć angielska wersja i jest to całkiem dobre tłumaczenie ...)

Sztuczka polega na znalezieniu wszystkich wersji, które odnoszą się do MVC3 (takich jak zestawy Razor, Mvc, Helper, dowiesz się, czym one są, jeśli przejdziesz do odwołań i sprawdzisz wszystkie nowsze wersje zestawu, do którego się odwołujesz) i zmienisz je z 1.0.0.0 do 2.0.0.0 i od 3.0.0.0 do 4.0.0.0 (ponieważ klucze publiczne są takie same). Możesz także spróbować usunąć wersje zgodnie z blogiem.

Kolejną ważną rzeczą jest to, że te ustawienia znajdują się we wszystkich plikach Web.Configs. Więc nie tylko pod Twoim rootem, ale także w widoku, obszarze / {obszar} / widoku itp.

Czuję, że to rozwiązanie może pozwolić ci całkowicie uaktualnić do MVC4 zamiast mieć hybrydę, która i tak nie działała dla mnie.

laorient
źródło
4
  1. W programie Visual Studio utwórz nową „jednorazową” aplikację ASP.NET MVC 4 w innym miejscu w oddzielnym folderze.
  2. Zastąp plik web.config w folderze Views świeżo utworzonym plikiem Views web.config z nowej aplikacji jednorazowej.

Zauważysz:

System.Web.WebPages.Razorzmienia się z Version=1.0.0.0na Version=2.0.0.0 System.Web.Mvczmiany z Version=3.0.0.0naVersion=4.0.0.0

James Lawruk
źródło
3

Jeśli masz ten problem i wypróbowałeś powyższe rozwiązania, ale to nie działa, sprawdź plik web.config w folderze Widoki. Mogą istnieć pewne konfiguracje, które powodują konflikt pliku Web.config w folderze głównym aplikacji

user1047559
źródło
0

Część twojego kodu działa na bieżących bitach MVC, podczas gdy inne zostały wypchnięte do nowszych. Bez zrozumienia kodu nie mogę powiedzieć, który konkretny bit powoduje problem.

Powiedziawszy to, nigdy nie uruchomiłbym wersji beta na maszynie produkcyjnej. W dzisiejszych czasach utworzenie maszyny wirtualnej i uruchomienie wersji beta na obrazie jest zbyt łatwe. W systemie Windows 7+, możesz uruchomić obraz z metalu i nie przyjmować najlepszego trafienia, jeśli tego potrzebujesz (z narzędziami deweloperskimi w wersji beta, często to robisz).

Gregory A Beamer
źródło
Tak, ale ta wersja beta ma licencję na uruchomienie. W końcu i tak jest na maszynie wirtualnej, ale maszyna wirtualna ma również ASP.NET MVC 3.
Nikos Baxevanis
Musisz określić, który bit w 3 działa w 4, ponieważ w tym miejscu występuje konflikt. To samo zdarzyło się dość często w formularzach sieci Web, gdy przeniosły się do ram czasowych .NET 2 i było sporym problemem w przypadku jakichkolwiek dodatków (takich jak MVC?).
Gregory A Beamer
W rzeczywistości jest to bardzo duży projekt ASP.NET MVC 3. Nic nie działa w 4. Nie mogłem rozpocząć projektu 3 to wszystko. Dodanie <add key = "webpages: Version" value = "1.0.0.0" /> do elementu appSettings rozwiązało problem.
Nikos Baxevanis
0

Ze względu na kompletność ...

Możesz też całkowicie wyłączyć strony internetowe, jeśli ich nie używasz.

<appSettings>
    <add key="webpages:Enabled" value="false" />
</appSettings>

(Nadal nie mam całkowitej jasności co do relacji między widokami maszynki do golenia a stronami internetowymi, ale wydaje mi się, że moja aplikacja MVC z widokami maszynki do golenia nadal działa z wyłączonymi stronami internetowymi).

Piotr
źródło
0

Jako ostatni krok wyczyść folder bin z projektu, z którego pochodzi błąd.

natdev1
źródło