InvalidCastException được ném sau khi cài đặt ASP.NET MVC 4 Beta


81

Tôi nhận được ngoại lệ sau sau khi cài đặt ASP.NET MVC 4 Beta trên máy có ASP.NET MVC 3.

System.InvalidCastException không được xử lý bởi mã người dùng Message = [A] System.Web.WebPages.Razor.Configuration.HostSection không thể được truyền sang [B] System.Web.WebPages.Razor.Configuration.HostSection. Loại A bắt nguồn từ 'System.Web.WebPages.Razor, Phiên bản = 1.0.0.0, Văn hóa = trung lập, PublicKeyToken = 31bf3856ad364e35' trong ngữ cảnh 'Mặc định' tại vị trí 'C: \ Windows \ Microsoft.Net \ assembly \ GAC_MSIL \ System .Web.WebPages.Razor \ v4.0_1.0.0.0__31bf3856ad364e35 \ System.Web.WebPages.Razor.dll '. Loại B có nguồn gốc từ 'System.Web.WebPages.Razor, Version = 2.0.0.0, Culture = trung lập, PublicKeyToken = 31bf3856ad364e35' trong ngữ cảnh 'Mặc định' tại vị trí 'C: \ Windows \ Microsoft.Net \ assembly \ GAC_MSIL \ System .Web.WebPages.Razor \ v4.0_2.0.0. 0__31bf3856ad364e35 \ System.Web.WebPages.Razor.dll '. Nguồn = System.Web.WebPages.Razor

StackTrace:

tại System.Web.WebPages.Razor.WebRazorHostFactory.GetRazorSection (String virtualPath) tại System.Web.WebPages.Razor.WebRazorHostFactory.CreateHostFromConfig (String virtualPath, String vật lýPath) at System System.Web.WebPages.Razor.RazorBuildProvider.CreateHost () tại System.Web.WebPages.Razor.RazorBuildProvider.EnsureGeneratedCode () tại System.Web.WebPages.Razor.RazorBuildProvider.get System.RazorBuildProvider. GetCompilerTypeFromBuildProvider (BuildProvider buildProvider) tại System.Web.Compilation.BuildProvidersCompiler.ProcessBuildProviders () tại System.Web.Compilation.BuildProvidersCompiler.PerformBuild () tại System.Web.Compilation.BuildManager.CompileWebFile (VirtualPath VirtualPath) tại System.Web.Compilation.BuildManager.GetVPathBuildResultInternal (VirtualPath VirtualPath, Boolean noBuild, Boolean allowCrossApp, Boolean allowBuildInPrecompile, Boolean throwIfNotFound, Boolean ensureIsUpToDate) tại System.Web.Compilation.BuildManager.GetVPathBuildResultWithNoAssert (HttpContext bối cảnh, VirtualPath VirtualPath , Boolean noBuild, Boolean allowCrossApp, Boolean allowBuildInPrecompile, Boolean throwIfNotFound, Boolean đảm bảoIsUpToDate) tại System.Web.Compilation.BuildManager.GetVirtualPathObjectFactory (VirtualPath virtualPath, Boolean. Web.Mvc.IBuildManager.FileExists (String virtualPath) tại System.Web.Mvc.BuildManagerViewEngine.FileExists (ControllerContext controllerContext, String virtualPath) tại System.Web.Mvc.VirtualPathProviderViewEngine.GetPathFromGeneralName (ControllerContext controllerContext, List`1 vị trí, String name, String controllerName, String areaName, String cacheKey, String [] & seek trong System.Web. Mvc.VirtualPathProviderViewEngine.GetPath (ControllerContext controllerContext, String [] location, String [] areaLocations, String locationPropertyName, String name, String controllerName, String cacheKeyPrefix, Boolean useCache, String [] & seekLocations) tại System.Webath.MarvcProviderViewEbath. (ControllerContext controllerContext, String viewName, String masterName, Boolean useCache) tại System.Web.Mvc.ViewEngineCollection. <> C__DisplayClassc.b__b (IViewEngine e) tại System.Web.Mvc.ViewEngineCollection.Find (tra cứu Func`2, Boolean trackSearchedPaths) tại System.Web.Mvc.ViewEngineCollection.FindView (ControllerContext controllerContext, String viewName, String masterName) tại System.Web.Mvc .ViewResult.FindView (ControllerContext context) tại System.Web.Mvc.ViewResultBase.ExecuteResult (ControllerContext context) tại System.Web.Mvc.ControllerActionInvoker.InvokeActionResult (ControllerContext controllerContext, ActionResult actionResult) tại System.Web. c__DisplayClass1c.b__19 () tại System.Web.Mvc.ControllerActionInvoker.InvokeActionResultFilter (Bộ lọc IResultFilter, ResultExecutingContext preContext, Func`1 tiếp tục) tại System.Web.Mvc.ControllerActionInvoker. <> c1ciscis.> c__DisplayClass1e.b__1b () tại System.Web.Mvc.ControllerActionInvoker.InvokeActionResultWithFilters (bộ lọc ControllerContext controllerContext, IList`1, ActionResult actionResult) tại System.Web.Mvc.ControllerActionInvoker.InvokeA điều khiển hành độngNameActionInvoker.InvokeA Controller Mvc.Controller.ExecuteCore () tại [project_namespace] .Controllers.GlobalizationController.ExecuteCore () trong [file_path] tại System.Web.Mvc.ControllerBase.Execute (RequestContext requestContext) tại System.Web.Mvc.ControllerBase.System.Web.ControllerBase.System.Web. Mvc.IController.Execute (RequestContext requestContext) tại System.Web.Mvc.MvcHandler. <> C__DisplayClass6. <> C__DisplayClassb.b__5 () tại System.Web.Mvc.Async.AsyncResultWrapper. <> C__Display (Class1.b__. Web.Mvc.Async.AsyncResultWrapper. <> C__DisplayClass8`1.b__7 (IAsyncResult _) tại System.Web.Mvc.Async.AsyncResultWrapper.WrappedAsyncResult`1.End () tại System.Web.Mvc.MvcHandler. <> C System.Web.Mvc.SecurityUtil.b__0 (Hành động f) tại System.Web.Mvc.SecurityUtil.ProcessInApplicationTrust (Hành động hành động) tại System.Web.Mvc.MvcHandler.EndProcessRequest (IAsyncResult asyncResult) tại System.Web.Mvc.MvcHandler. System.Web.IHttpAsyncHandler.EndProcessRequest (kết quả IAsyncResult) tại System.Web.HttpApplication.CallHandlerExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute () tại System.Web.HttpApplication.ExecuteStepWeb.Mvc.Async.AsyncResultWrapper.WrappedAsyncResult`1.End () tại System.Web.Mvc.MvcHandler. <> C__DisplayClasse.b__d () tại System.Web.Mvc.SecurityUtil.b__0 (Hành động f) tại System.Web. Mvc.SecurityUtil.ProcessInApplicationTrust (Hành động hành động) tại System.Web.Mvc.MvcHandler.EndProcessRequest (IAsyncResult asyncResult) tại System.Web.Mvc.MvcHandler.System.Web.IHttpAsyncHandler.EndProcessRequesult kết quả (IAsyncp System) at. CallHandlerExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute () tại System.Web.HttpApplication.ExecuteStep (bước IExecutionStep, Boolean & completeSynchronously)Web.Mvc.Async.AsyncResultWrapper.WrappedAsyncResult`1.End () tại System.Web.Mvc.MvcHandler. <> C__DisplayClasse.b__d () tại System.Web.Mvc.SecurityUtil.b__0 (Hành động f) tại System.Web. Mvc.SecurityUtil.ProcessInApplicationTrust (Hành động hành động) tại System.Web.Mvc.MvcHandler.EndProcessRequest (IAsyncResult asyncResult) tại System.Web.Mvc.MvcHandler.System.Web.IHttpAsyncHandler.EndProcessRequesult kết quả (IAsyncp System) at. CallHandlerExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute () tại System.Web.HttpApplication.ExecuteStep (bước IExecutionStep, Boolean & completeSynchronously)b__0 (Hành động f) tại System.Web.Mvc.SecurityUtil.ProcessInApplicationTrust (Hành động hành động) tại System.Web.Mvc.MvcHandler.EndProcessRequest (IAsyncResult asyncResult) tại System.Web.Mvc.MvcHandler.System.Web.IHttpAsyncHandler.Web.IHttpAsync Kết quả IAsyncResult) tại System.Web.HttpApplication.CallHandlerExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute () tại System.Web.HttpApplication.ExecuteStep (Bước IExecutionStep, Boolean & completeSynchronously)b__0 (Hành động f) tại System.Web.Mvc.SecurityUtil.ProcessInApplicationTrust (Hành động hành động) tại System.Web.Mvc.MvcHandler.EndProcessRequest (IAsyncResult asyncResult) tại System.Web.Mvc.MvcHandler.System.Web.IHttpAsyncHandler.Web.IHttpAsync Kết quả IAsyncResult) tại System.Web.HttpApplication.CallHandlerExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute () tại System.Web.HttpApplication.ExecuteStep (Bước IExecutionStep, Boolean & completeSynchronously)HttpApplication.IExecutionStep.Execute () tại System.Web.HttpApplication.ExecuteStep (bước IExecutionStep, Boolean & completeSynchronously)HttpApplication.IExecutionStep.Execute () tại System.Web.HttpApplication.ExecuteStep (bước IExecutionStep, Boolean & completeSynchronously)

Điều này chặn tôi hoàn toàn và trong khi tôi muốn giữ lại bản beta, tôi có thể cần phải xóa nó hoàn toàn để loại bỏ ngoại lệ.


1
Bạn có đang chạy bản xem trước .net 4.5 Dev không? (Cái đó không tương thích với Phiên bản Beta hiện tại) (chỉ để ghi lại, không phải tôi là người đã phản đối, câu hỏi là chính đáng)
Michael Stum

1
Không, tôi không chạy 4,5 nào cả.
Nikos Baxevanis

3
Nghiêm túc mà nói, tại sao điều này lại bị bỏ phiếu? Tôi cung cấp phản hồi cho điều gì đó có thể xảy ra với người khác.
Nikos Baxevanis

@MichaelStum OK, không cần lo lắng. :)
Nikos Baxevanis

Xin lỗi vì sự nhầm lẫn. Tôi đã cố gắng "đánh dấu yêu thích" câu hỏi này và nhấp chuột sai = P Đã xóa bỏ phiếu yêu thích, lần này đã thêm yêu thích chính xác.
Josh Darnell

Câu trả lời:


31

Hãy thử thêm phần sau vào web.config của bạn:

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

Vấn đề có thể do nhiều nhà cung cấp bản dựng đã được đăng ký và người chiến thắng gần đây nhất.


101

Tôi đã gặp vấn đề tương tự, nhưng khi di chuyển ASP.NET MVC 3 sang ASP.NET MVC 4. Bằng cách này, tôi đã về chủ đề này. Tôi đã tìm ra giải pháp cho vấn đề, nhưng nguồn của nó khác, nó không phải từWebPages phiên bản.

Tôi đã làm theo hướng dẫn chính thức (có thể nói) Nâng cấp Dự án ASP.NET MVC 3 lên ASP.NET MVC 4 .

Để giải quyết vấn đề, bạn phải thêm vào Web.Config (có thể là xung quanh những cái đã thêm trước đó):

<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>

Cũng trong ghi chú không đề cập đến việc thay đổi Tham chiếu của System.Web.Helpers từ 1.0.0.0 thành 2.0.0.0 (xóa và thêm mới).


2
+1 Cảm ơn rất nhiều vì đã chia sẻ. Một biến thể nhỏ mà tôi đã thực hiện là sử dụng oldVersion="1.0.0.0-2.0.0.0"chỉ để tuân theo quy ước được sử dụng trong mẫu dự án MVC4. Điều thú vị là dependentAssemblyfor System.Web.WebPages.Razorcũng không có trong Web.config gốc trong mẫu dự án MVC4.
Scotty.NET

1
Tôi đã có một vấn đề tương tự cập nhật các gói MVC 4 NuGet đến 5.1.1, giải quyết với trên nhưngoldVersion="2.0.0.0" newVersion="3.0.0.0"
Luke Puplett

34

Một giải pháp nữa, khá muộn ... Tôi cũng gặp phải vấn đề này. Đã thực hiện tất cả các bản sửa lỗi được liệt kê ở đây (Thank You All !!!) nhưng không thể khắc phục được lỗi. Cuối cùng, trong tuyệt vọng, tôi tìm thấy một tệp web.config trong thư mục Views. Trong tệp này, tôi đã tìm thấy một số tham chiếu đến phiên bản System.Web.Mvc và nâng tất cả chúng lên "4.0.0.0". Quan trọng hơn, tôi đã tìm thấy các dòng sau và cập nhật số phiên bản cho "system.web.webPages.Razor" từ "1.0.0.0" thành "2.0.0.0" và đột nhiên, mọi thứ đã hoạt động trở lại. Hy vọng rằng điều này sẽ giúp ích cho người khác.

<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.


1
Cũng đừng quên về web.config trong Khu vực / Chế độ xem nếu bạn đang sử dụng Khu vực.
Antonin Jelinek

5

Tôi đã tìm thấy một cách khác để làm việc này, dọc theo blog của một người Đài Loan về việc nâng cấp từ MVC 2 lên MVC 3: http://blog.kkbruce.net/2011_04_01_archive.html (Bạn thực sự có thể sử dụng Microsoft Dịch trong IE10 để xem phiên bản tiếng Anh và nó là một bản dịch khá tốt ...)

Mẹo là tìm tất cả các phiên bản có liên quan đến MVC3 (chẳng hạn như các cụm Razor, Mvc, Helper, bạn sẽ biết chúng là gì nếu bạn truy cập tài liệu tham khảo của mình và xem tất cả các phiên bản mới hơn của cụm được tham chiếu của bạn) và thay đổi chúng từ 1.0.0.0 đến 2.0.0.0 và từ 3.0.0.0 đến 4.0.0.0 (vì các khóa công khai giống nhau). Bạn cũng có thể thử xóa các phiên bản theo blog.

Một điều quan trọng khác là các cài đặt này có trong tất cả các Web.Configs. Vì vậy, không chỉ dưới gốc bạn mà còn trong Chế độ xem, Khu vực / {Khu vực} / Chế độ xem, v.v.

Tôi cảm thấy giải pháp này có thể cho phép bạn nâng cấp lên MVC4 hoàn toàn thay vì có một bản hybrid, điều này không phù hợp với tôi.


4
  1. Trong Visual Studio, tạo Ứng dụng ASP.NET MVC 4 "mới" trong một thư mục riêng biệt ở đâu đó.
  2. Thay thế tệp web.config trong thư mục Chế độ xem của bạn bằng tệp Chế độ xem web.config mới được tạo từ ứng dụng mới.

Bạn sẽ nhận thấy:

System.Web.WebPages.Razorthay đổi từ Version=1.0.0.0để Version=2.0.0.0 System.Web.Mvcthay đổi từ Version=3.0.0.0đếnVersion=4.0.0.0


3

Nếu bạn đang gặp sự cố này và bạn đã thử các giải pháp ở trên nhưng cách này không hiệu quả, vui lòng kiểm tra web.config trong thư mục Chế độ xem của bạn. Có thể có một số cấu hình của chúng xung đột với tệp Web.config trong thư mục gốc Ứng dụng của bạn


0

Một số mã của bạn đang chạy trên các bit MVC hiện tại, trong khi những mã khác đã được đẩy lên phiên bản mới hơn. Nếu không hiểu mã, tôi không thể cho bạn biết bit cụ thể nào đang gây ra sự cố.

Phải nói rằng, tôi sẽ không bao giờ thiết lập bản beta trên máy phát triển sản xuất. Ngày nay, quá dễ dàng để tạo một máy ảo và chạy bản beta trên một hình ảnh. Trong Windows 7+, bạn có thể khởi động hình ảnh khỏi kim loại và không phải chịu ảnh hưởng hoàn toàn, nếu bạn cần điều đó (với công cụ dành cho nhà phát triển, bạn hoàn toàn có thể làm được).


Có, nhưng bản Beta này có giấy phép hoạt động. Rốt cuộc thì nó cũng nằm trên VM nhưng VM cũng có ASP.NET MVC 3.
Nikos Baxevanis 22/02/12

Bạn cần xác định xem bit nào trong 3 đang chạy trong 4, vì đó là nơi bạn đang gặp xung đột. Điều tương tự cũng xảy ra khá nhiều trong các Biểu mẫu web khi chúng chuyển sang khung thời gian .NET 2 và khá là một vấn đề với bất kỳ tiện ích bổ sung nào (như MVC?).
Gregory A Beamer

Trên thực tế, đó là dự án ASP.NET MVC 3 rất lớn. Không có gì đang chạy trong 4. Tôi không thể bắt đầu dự án 3 đó là tất cả. Thêm phần tử <add key = "webpages: Version" value = "1.0.0.0" /> vào appSettings đã giải quyết được vấn đề này.
Nikos Baxevanis

0

Vì lợi ích của sự hoàn chỉnh ...

Bạn cũng có thể tắt hoàn toàn các trang web nếu bạn không sử dụng chúng.

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

(Tôi vẫn chưa hoàn toàn rõ ràng về mối quan hệ giữa lượt xem dao cạo và trang web, nhưng có vẻ như ứng dụng MVC của tôi với lượt xem dao cạo vẫn hoạt động với các trang web bị tắt.)


0

Cũng như bước cuối cùng, hãy xóa thư mục bin của bạn khỏi dự án nơi xuất phát lỗi.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.