【问题标题】:Migrating my MVC 3 application to MVC 4将我的 MVC 3 应用程序迁移到 MVC 4
【发布时间】:2011-12-01 20:48:13
【问题描述】:

我真的不知道该怎么办,我正在关注this article,它展示了如何手动迁移我的 MVC 3 应用程序。

我遵循了所有步骤,但是在运行我的应用程序时出现以下错误:

“/”应用程序中的服务器错误。

无法加载文件或程序集“System.Web.WebPages.Razor, 版本=1.0.0.0,文化=中性,PublicKeyToken=31bf3856ad364e35' 或 它的依赖项之一。定位程序集的清单定义 与程序集引用不匹配。 (HRESULT 的例外情况: 0x80131040)

描述:执行过程中发生了未处理的异常 当前的网络请求。请查看堆栈跟踪以获取更多信息 有关错误的信息以及它在代码中的来源。

异常详细信息:System.IO.FileLoadException:无法加载文件或 程序集'System.Web.WebPages.Razor,版本=1.0.0.0,文化=中性, PublicKeyToken=31bf3856ad364e35' 或其依赖项之一。这 定位程序集的清单定义与程序集不匹配 参考。 (HRESULT 异常:0x80131040)

来源错误:

在执行过程中产生了一个未处理的异常 当前的网络请求。有关原产地和位置的信息 可以使用下面的异常堆栈跟踪来识别异常。

装配负载跟踪:以下信息可能有助于 确定为什么程序集 'System.Web.WebPages.Razor, 版本=1.0.0.0,文化=中性,PublicKeyToken=31bf3856ad364e35' 无法加载。

警告:程序集绑定日志记录已关闭。启用程序集绑定 失败记录,设置注册表值 [HKLM\Software\Microsoft\Fusion!EnableLog] (DWORD) 为 1。注意:有 是与装配绑定失败相关的一些性能损失 记录。要关闭此功能,请删除注册表值 [HKLM\Software\Microsoft\Fusion!EnableLog]。

堆栈跟踪:

[FileLoadException: 无法加载文件或程序集 'System.Web.WebPages.Razor,版本=1.0.0.0,文化=中性, PublicKeyToken=31bf3856ad364e35' 或其依赖项之一。这 定位程序集的清单定义与程序集不匹配 参考。 (HRESULT 异常:0x80131040)]
Microsoft.Web.Samples.PreApplicationStartCode.Start() +0

[InvalidOperationException: 应用程序启动前初始化 方法 Start on type Microsoft.Web.Samples.PreApplicationStartCode 引发异常并显示以下错误消息:无法加载 文件或程序集 'System.Web.WebPages.Razor, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35' 或其之一 依赖关系。定位程序集的清单定义不 匹配程序集引用。 (HRESULT 异常:0x80131040)。]
System.Web.Compilation.BuildManager.InvokePreStartInitMethods(ICollection`1 方法)+423
System.Web.Compilation.BuildManager.CallPreStartInitMethods() +306
System.Web.Hosting.HostingEnvironment.Initialize(ApplicationManager appManager, IApplicationHost appHost, IConfigMapPathFactory configMapPathFactory, HostingEnvironmentParameters hostingParameters, PolicyLevel policyLevel, 异常 appDomainCreationException) +677

[HttpException(0x80004005):应用程序启动前初始化 方法 Start on type Microsoft.Web.Samples.PreApplicationStartCode 引发异常并显示以下错误消息:无法加载 文件或程序集 'System.Web.WebPages.Razor, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35' 或其之一 依赖关系。定位程序集的清单定义不 匹配程序集引用。 (HRESULT 异常:0x80131040)。]
System.Web.HttpRuntime.FirstRequestInit(HttpContext 上下文) +9079340 System.Web.HttpRuntime.EnsureFirstRequestInit(HttpContext 上下文)+97 System.Web.HttpRuntime.ProcessRequestNotificationPrivate(IIS7WorkerRequest WR,HttpContext 上下文)+256

版本信息:Microsoft .NET Framework 版本:4.0.30319; ASP.NET 版本:4.0.30319.237

我查看了代码,但仅在 2.0 版本 1.0 中没有看到对 System.Web.WebPages.Razor 的引用。

【问题讨论】:

    标签: asp.net-mvc-3 migration razor


    【解决方案1】:

    这很简单,当您更新到 MVC 4.0.0.0 时,解决方案中的 webconfig 仍然指向 MVC 3.0.0.0.0。 所以只需替换 MVC 版本 3.0.0.0.0。由 4.0.0.0.0

    对其他程序集执行相同操作,检查程序集的版本,检查项目引用中相应程序集的属性。

    【讨论】:

      【解决方案2】:

      这是另一个可以用来将 mvc 3 升级到 mvc 4 的 Nuget 包 https://nuget.org/packages/UpgradeMvc3ToMvc4

      【讨论】:

        【解决方案3】:

        我假设您有 MVC3 Intranet Web 应用程序,当使用 NuGet 从 MVC3 升级到 MVC4 时,您的应用程序现在引用 System.Web.WebPages.Razor 版本 2.0.0.0,而不是 System.Web.WebPages.Razor 版本 1.0.0.0 .这是我解决引用的方法。

        有两个地方需要修复:

        1. 在根 web.config 中,

          <compilation debug="true" targetFramework="4.0">
            <assemblies>
              . . .
              <add assembly="System.Web.WebPages, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" />
              . . .
            </assemblies>
          </compilation>
          

        将版本=1.0.0.0 更改为版本=2.0.0.0

        所以您的新参考将如下所示:

            <compilation debug="true" targetFramework="4.0">
              <assemblies>
                . . .
                <add assembly="System.Web.WebPages, Version=2.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" />
                . . .
              </assemblies>
            </compilation>
        
        1. 在 Views 文件夹中,有 web.config 文件。检查此文件,您将看到它引用了版本 1。将 Views 文件夹中的整个 web.config 文件替换为新的 web.config 文件。备份旧的 web.config 文件,以防万一。要为 Views 文件夹获取全新的 web.config,请为 Intranet 创建一个新的 MVC4 应用程序。转到视图文件夹。将新应用程序的 Views 文件夹中的 Web.Config 文件复制到损坏的应用程序的 Views 文件夹中。

        希望对你有帮助!

        【讨论】:

          【解决方案4】:

          使用 NuGet 并添加包 Microsoft.AspNet.Mvc (Microsoft Asp.Net Mvc 4)。这应该升级您的参考。见:

          https://nuget.org/packages/Microsoft.AspNet.Mvc

          您需要升级 web.config 中的程序集引用。

          从根 web.config 中删除:

          <assemblies>
            <add assembly="System.Web.Helpers, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" />
            <add assembly="System.Web.Mvc, Version=3.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" />
            <add assembly="System.Web.WebPages, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" />
          </assemblies>
          

          添加到根 web.config:

          <runtime>
            <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
              <dependentAssembly>
                <assemblyIdentity name="System.Web.Helpers" publicKeyToken="31bf3856ad364e35" />
                <bindingRedirect oldVersion="1.0.0.0-2.0.0.0" newVersion="2.0.0.0" />
              </dependentAssembly>
              <dependentAssembly>
                <assemblyIdentity name="System.Web.Mvc" publicKeyToken="31bf3856ad364e35" />
                <bindingRedirect oldVersion="0.0.0.0-4.0.0.0" newVersion="4.0.0.0" />
              </dependentAssembly>
              <dependentAssembly>
                <assemblyIdentity name="System.Web.WebPages" publicKeyToken="31bf3856ad364e35" />
                <bindingRedirect oldVersion="1.0.0.0-2.0.0.0" newVersion="2.0.0.0" />
              </dependentAssembly>
            </assemblyBinding>
          </runtime>
          

          视图/Web.Config:

          将 Razor 从 1.0.0.0 更改为 2.0.0.0:

          <configSections>
            <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>
          </configSections>
          
          <host factoryType="System.Web.Mvc.MvcWebRazorHostFactory, System.Web.Mvc, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" />
          
          <pages validateRequest="false"
                 pageParserFilterType="System.Web.Mvc.ViewTypeParserFilter, System.Web.Mvc, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35"
                 pageBaseType="System.Web.Mvc.ViewPage, System.Web.Mvc, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35"
                 userControlBaseType="System.Web.Mvc.ViewUserControl, System.Web.Mvc, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35">
            <controls>
              <add assembly="System.Web.Mvc, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" namespace="System.Web.Mvc" tagPrefix="mvc" />
            </controls>
          </pages>
          

          【讨论】:

          • 更改后,我在剃须刀页面上失去了 VS 2010 智能感知支持。例如; “@model MyClass”看起来是错误的,但可以工作。我应该怎么做才能收回智能感知支持?
          • 转到编辑 -> 智能感知 -> 刷新本地缓存和 2) 按 Ctrl+Shift+R
          • 此外,我还必须删除根配置中的&lt;add key="webpages:Version" value="1.0.0.0"/&gt;
          • 在完成上述步骤后,我遇到了同样的问题。我得到 1 的编译时错误。无法加载类型 'System.Web.Mvc.ViewUserControl' 和 2. 无法加载类型 'System.Web.Mvc.ViewPage 和 3. 无法加载类型 'System.Web.Mvc .ViewMasterPage 虽然这个错误只与我的一个 MVC 项目有关。其他的构建良好,我已经测试了上面列表中提到的类实际上存在于代码中。嗯...这是一个错误,应该发生在我的所有升级项目中,而不仅仅是一个。非常感谢任何帮助
          【解决方案5】:

          您是否在整个解决方案中全局搜索过 System.Web.WebPages.Razor, Version=1.0.0.0?你还引用System.Web.WebPages.Razor(版本1.0.0.0)吗?你引用 System.Web.WebPages.Razor 版本 2.0.0.0 吗?


          [更新]我终于遇到了同样的问题。我安装和卸载的其中一个 NuGet 包似乎并没有完全删除它使用的对 System.Web.Razor 的引用。清理解决方案没有帮助,因为 Web 应用程序没有直接使用 DLL。我终于通过手动删除整个 bin 目录来让它工作......

          【讨论】:

          • 我查看了整个解决方案,没有参考 1.0 版。即使是编辑过的文件 .csproj 和 .sln 也在寻找这个参考。但我没有找到。
          【解决方案6】:

          按照上面的建议重新安装 AspNetSprite 包并不能解决我的问题。但是在根 web.config 文件的 runtime\assemblyBinding 部分添加这些行是可行的:

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

          【讨论】:

            【解决方案7】:

            您是否忘记更新Views\Web.Config 中的引用?其中的引用用于构建视图页面。

            【讨论】:

            • 我已经检查过了,你可以在下面的 cmets 中看到。
            【解决方案8】:

            我的应用程序使用了第三方包 AspNetSprites-MvcAndRazorHelper。重新安装了这个包,引用的错误已更正。

            【讨论】:

              【解决方案9】:

              检查视图文件夹中的 web.config。

              更新:

              这点看起来很可疑。

              Microsoft.Web.Samples.PreApplicationStartCode

              您是否引用了任何示例应用程序库,例如 MVC 期货或类似的东西?

              【讨论】:

              • 已经全部检查过了,没有任何东西指向1.0版本。查看根 Web.config:gist.github.com/1265901
              • 我不明白。我在 web.config 中没有找到任何带有 Microsoft.Web.Samples.PreAppliaction... 的内容我使用 ElmahMelezesMvc.MailerAutoMapper
              • 我也使用这些 DLL .. Microsoft.Web.Samples.ImageOptimizationFrameworkMicrosoft.Web.Samples.SpriteHelper .. 但我不明白它是如何导致这个错误的。如果这就是它的原因。
              • @RidermandeSousaBarbosa - 很明显,那些 dll 引用 Razor 并要求 1.0 版。命名空间相同的事实显然是问题所在。
              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2011-12-02
              • 2015-11-17
              • 2015-10-19
              相关资源
              最近更新 更多