网站在asp.net中停止工作 System.Web.WebPages.Razor.Configuration.HostSection无法转换为...

115
在服务器上出现了如下问题:
“System.Web.WebPages.Razor.Configuration.HostSection”无法转换为“System.Web.WebPages.Razor.Configuration.HostSection”。类型“A”来源于“System.Web.WebPages.Razor, Version=2.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35”,位于位置“C:\Windows\Microsoft.Net\assembly\GAC_MSIL\System.Web.WebPages.Razor\v4.0_2.0.0.0__31bf3856ad364e35\System.Web.WebPages.Razor.dll”的默认上下文中。类型“B”来源于“System.Web.WebPages.Razor, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35”,位于位置“C:\Windows\Microsoft.Net\assembly\GAC_MSIL\System.Web.WebPages.Razor\v4.0_1.0.0.0__31bf3856ad364e35\System.Web.WebPages.Razor.dll”的默认上下文中。
问题描述:当前Web请求的执行过程中发生未处理的异常,请查看堆栈跟踪以获取有关错误的更多信息及其在代码中的起源位置。
异常详细信息:System.InvalidCastException:“System.Web.WebPages.Razor.Configuration.HostSection”无法转换为“System.Web.WebPages.Razor.Configuration.HostSection”。类型“A”来源于“System.Web.WebPages.Razor, Version=2.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35”,位于位置“C:\Windows\Microsoft.Net\assembly\GAC_MSIL\System.Web.WebPages.Razor\v4.0_2.0.0.0__31bf3856ad364e35\System.Web.WebPages.Razor.dll”的默认上下文中。类型“B”来源于“System.Web.WebPages.Razor, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35”,位于位置“C:\Windows\Microsoft.Net\assembly\GAC_MSIL\System.Web.WebPages.Razor\v4.0_1.0.0.0__31bf3856ad364e35\System.Web.WebPages.Razor.dll”的默认上下文中。
源代码错误:
我已经在服务器和电脑上安装了MVC 3,已尝试用15天前的代码库替换,但仍然存在同样的问题。现在我想要解决这个问题,请问有人知道怎么修复吗?

似乎在您的应用程序中,一些程序集依赖于不同版本的razor。 尝试使用ildasm或.NET Reflector检查您的程序集以查看其依赖关系。 - Paulo Morgado
9个回答

200

在根 Web.config 中,确保 assemblyBinding 包含程序集“System.Web.WebPages.Razor”和“System.Web.Mvc”的适当版本。同时检查它们的实际存在性,因为我的“System.Web.WebPages.Razor”程序集标签丢失导致了错误。在撰写本文时,我已将程序集版本设置为 3.0 和 5.0,并进行了完整的 NuGet 更新。代码应该类似于以下内容。publicKeyToken 将在版本之间保持不变。

<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
  <!--some more bidings-->
  <dependentAssembly>
        <assemblyIdentity name="System.Web.WebPages.Razor"
            publicKeyToken="31bf3856ad364e35" />
        <bindingRedirect oldVersion="1.0.0.0-3.0.0.0" newVersion="3.0.0.0"/>
  </dependentAssembly>

  <dependentAssembly>
    <assemblyIdentity name="System.Web.Mvc" publicKeyToken="31bf3856ad364e35" />
    <bindingRedirect oldVersion="1.0.0.0-5.0.0.0" newVersion="5.0.0.0" />
  </dependentAssembly>
<!--some more bidings-->
</assemblyBinding>

2
对我有用。我缺少Razor信息,而MVC指向了错误的版本。 - Hoakie
与@Hoakie相同的情况-将Razor更新为3.0.0,MVC更新为5.0.0,但没有Razor dependentAssembly引用,而MVC仍然显示oldVersion="1.0.0.0-4.0.0.0" newVersion="4.0.0.0"。添加了上面的Razor dependentAssembly XML,并将4.0.0.0更改为5.0.0.0,问题解决。 - Scott Baker
2
这对我有用,谢谢。我确实有正确绑定的"System.Web.WebPages",但在我添加Razor密钥之前它并没有起作用。然而,在其他项目中,我不必这样做,我不确定区别在哪里,为什么超类绑定不能处理Razor。有人知道答案吗? - Shanerk
一样,我有MVC的入口,但没有Razor的入口。现在它可以工作了。谢谢。 - Yves Tkaczyk
这个有效https://dev59.com/QmQm5IYBdhLWcg3wowSw - Rodolpho Brock
显示剩余3条评论

40

我的情况是从mvc4升级到mvc5。

我确保我的引用与新创建的mvc5应用程序同步,相应地更新了web.config文件,但仍然无法正常工作。当我将我的web.config文件更改为(在VIEWS目录内)时,它最终起作用了:

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

变成这样:

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

记住:停止IIS(无论是Express还是Native),清理解决方案,构建并运行。


我认为这个回答实际上应该是一个答案。当使用update-package方法从mvc4升级到mvc5时,汇编绑定通常是可以的。 - Roman

34

如果Ian的回答不够详细(并且组件正确,但转换仍然有误),很可能您还没有更新<configSections>以反映新程序集。确保程序集部分还引用了System.Web.WebPages.Razor库的3.0版本。例如:

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

(请注意它们现在都引用了version=3.0.0)


8
我只想补充一点,如果您在根Web.Config中找不到这些设置,请检查Views文件夹中的Web.Config。 - gligoran
4
对我来说,问题在于Views文件夹中的web.config。 - Matthew Nichols

15

这篇文章对我很有帮助。谢谢! - gligoran
我认为这篇文章包含了最正确和完整的升级描述,谢谢。 - Mikhail Brinchuk

2

问题:

将[A]System.Web.WebPages.Razor.Configuration.HostSection强制转换为[B]System.Web.WebPages.Razor.Configuration.HostSection。类型A源自于“System.Web.WebPages.Razor,版本=2.0.0.0,文化=中性,PublicKeyToken=31bf3856ad364e35”,位于位置“C:\Windows\Microsoft.Net\assembly\GAC_MSIL\System.Web.WebPages.Razor\v4.0_2.0.0.0__31bf3856ad364e35\System.Web.WebPages.Razor.dll”的上下文中。类型B源自于“System.Web.WebPages.Razor,版本=3.0.0.0,文化=中性,PublicKeyToken=31bf3856ad364e35”,位于位置“C:\Windows\Microsoft.NET\Framework64\v4.0.30319\Temporary ASP.NET Files\rbs.ceds.todomvcdemo\73d0b7c7\46e3986d\assembly\dl3\21020800\101279fc_da94cf01\System.Web.WebPages.Razor.dll”的上下文中。

识别:

错误出现在项目的配置文件web.config中。

您会发现Razor版本设置为2.0.0.0,而在您的项目中并没有2.0.0.0版本。

解决方案:

很简单,只需将版本从2.0.0.0更改为3.0.0.0即可。

type="System.Web.WebPages.Razor.Configuration.RazorWebSectionGroup, System.Web.WebPages.Razor, Version=3.0.0.0 type="System.Web.WebPages.Razor.Configuration.RazorPagesSection, System.Web.WebPages.Razor, Version=3.0.0.0

您不需要进行重定向等操作,这会使事情变得复杂。


1
这个问题在开发 MVC 4 时非常普遍,当你安装一个新版本的包时,会导致整个应用程序崩溃。唯一的解决办法是升级整个应用程序到更高版本或者安装与应用程序兼容的旧版包。

0

打开您系统中的两个dll文件位置,将其中一个dll复制到另一个文件位置中,然后尝试运行该项目。


0
我发现了一个问题和解决方案。
1. 我将我的代码目标定为4.0,然后上传代码,它可以工作。在此之前,我还将我的代码更新为asp.net MVC 4。
现在它可以工作 :)

3
你能具体说明一下吗? - nwayve

0

另一种修复这个问题的方法,而不必更新引用,是这样的

  <runtime>
    <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
      <dependentAssembly>
        <assemblyIdentity name="System.Web.Mvc" publicKeyToken="31bf3856ad364e35" />
        <bindingRedirect oldVersion="1.0.0.0-5.0.0.0" newVersion="3.0.0.0" />
      </dependentAssembly>
      <dependentAssembly>
        <assemblyIdentity name="System.Web.Pages.Razor" publicKeyToken="31bf3856ad364e35" culture="neutral" />
        <bindingRedirect oldVersion="0.0.0.0-3.2.0.0" newVersion="1.0.0.0" />
      </dependentAssembly>
    </assemblyBinding>
  </runtime>

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接