将我的MVC 3应用程序迁移到MVC 4

时间:2011-10-05 21:57:19

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

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

我按照所有步骤但在运行我的应用程序时出现以下错误:

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

     

无法加载文件或程序集'System.Web.WebPages.Razor,   Version = 1.0.0.0,Culture = neutral,PublicKeyToken = 31bf3856ad364e35'或   其中一个依赖项。定位程序集的清单定义   与装配参考不匹配。 (HRESULT的例外情况:   0x80131040)

     

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

     

异常详细信息:System.IO.FileLoadException:无法加载文件或   assembly'System.Web.WebPages.Razor,Version = 1.0.0.0,Culture = neutral,   PublicKeyToken = 31bf3856ad364e35'或其依赖项之一。该   找到程序集的清单定义与程序集不匹配   参考。 (HRESULT异常:0x80131040)

     

来源错误:

     

执行期间生成了未处理的异常   当前的网络请求。有关的来源和位置的信息   可以使用下面的异常堆栈跟踪来识别异常。

     

装配加载跟踪:以下信息可能对您有所帮助   确定汇编'System.Web.WebPages.Razor的原因,   Version = 1.0.0.0,Culture = neutral,PublicKeyToken = 31bf3856ad364e35'   无法加载。

     

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

     

堆栈追踪:

     

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

     

[InvalidOperationException:预应用程序启动初始化   方法从类型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 6   System.Web.Hosting.HostingEnvironment.Initialize(ApplicationManager   appManager,IApplicationHost appHost,IConfigMapPathFactory   configMapPathFactory,HostingEnvironmentParameters hostingParameters,   PolicyLevel policyLevel,Exception appDomainCreationException)+677

     

[HttpException(0x80004005):预应用程序启动初始化   方法从类型Microsoft.Web.Samples.PreApplicationStartCode开始   抛出以下错误消息的异常:无法加载   文件或程序集'System.Web.WebPages.Razor,Version = 1.0.0.0,   Culture = neutral,PublicKeyToken = 31bf3856ad364e35'或其中一个   依赖。定位程序集的清单定义没有   匹配程序集引用。 (HRESULT异常:0x80131040)。]
  System.Web.HttpRuntime.FirstRequestInit(HttpContext context)+9079340   System.Web.HttpRuntime.EnsureFirstRequestInit(HttpContext context)+97   System.Web.HttpRuntime.ProcessRequestNotificationPrivate(IIS7WorkerRequest   wr,HttpContext context)+256

     

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

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

9 个答案:

答案 0 :(得分:36)

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

答案 1 :(得分:2)

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

答案 2 :(得分:2)

我假设您有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>
    
  2. 将版本= 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. 使用新的web.config文件替换Views文件夹中的整个web.config文件。备份旧的web.config文件,以防万一。要获取Views文件夹的全新web.config,您需要为Intranet创建一个新的MVC4应用程序。转到Views文件夹。将Web.Config文件从新应用程序的Views文件夹复制到损坏的应用程序的Views文件夹。
    2. 希望它有所帮助!

答案 3 :(得分:1)

您是否在整个解决方案中全局搜索 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 目录来实现它...

答案 4 :(得分:1)

如上所述重新安装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>

答案 5 :(得分:0)

检查views文件夹中的web.config。

更新:

这一点看起来很可疑。

  

Microsoft.Web.Samples.PreApplicationStartCode

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

答案 6 :(得分:0)

我的应用程序使用了第三方软件包AspNetSprites-MvcAndRazorHelper。重新安装此软件包并更正了引用的错误。

答案 7 :(得分:0)

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

答案 8 :(得分:0)

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

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