Windows 更新后“命名空间‘System.Web.Mvc’中不存在类型或命名空间名称‘Html’”

Posted

技术标签:

【中文标题】Windows 更新后“命名空间‘System.Web.Mvc’中不存在类型或命名空间名称‘Html’”【英文标题】:After Windows update "The type or namespace name 'Html' does not exist in the namespace 'System.Web.Mvc'" 【发布时间】:2014-12-11 23:05:08 【问题描述】:

我进行了 Windows 更新,之后我的 asp.net mvc 5 应用程序将不再加载抱怨

CS0234: The type or namespace name 'html' does not exist in the namespace 'System.Web.Mvc'

表明我的观点 web.config 有问题

  <system.web.webPages.razor>
    <host factoryType="System.Web.Mvc.MvcWebRazorHostFactory, System.Web.Mvc, Version=5.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" />
    <pages pageBaseType="System.Web.Mvc.WebViewPage">
      <namespaces>
        <add namespace="System.Web.Mvc" />
        <add namespace="System.Web.Mvc.Ajax" />
        <add namespace="System.Web.Mvc.Html" />
        <add namespace="System.Web.Optimization"/>
        <add namespace="System.Web.Routing" />
        <add namespace="Ogre.Extensions" />
        <add namespace="Newtonsoft.Json"/>
      </namespaces>
    </pages>
  </system.web.webPages.razor>

现在这很令人困惑。在我的项目本身中,我可以看到Html 命名空间,在 ILSpy 中打开我的程序集我可以导航到绑定的System.Web.Mvc,我也可以,并且融合日志没有显示任何可疑的绑定错误。

好像只是我的观点正在(成功地)绑定到旧版本的 Mvc。为什么会发生这种情况?我该如何解决?

让我明确一点,没有任何配置甚至代码更改。这一切都在我在 IISExpress 上的开发机器上。它正在运行,我进行了更新并重新启动,现在它不再运行了。

这是我最近安装的更新。我可以开始一一删除它们,但我想知道实际出了什么问题,因为感觉好像我错过了故事的一部分。

【问题讨论】:

你的项目引用还好吗? @DavidG 是的,项目构建得很好,没有损坏的引用 此 SO 相关 ***.com/questions/26396489/… @kingdango 可能是相关的,但那里的最佳答案将 System.Web.Mvc 重新连接到 GAC 中的 4.0.0.1 而不是我的 nuget 包中的 5.0.0。我不想那样! 我们注意到我们的 System.Web.Mvc 项目引用现在将 Copy Local 设置为 False 而不是 True。将 Copy Local 设置回 True 可以解决该问题,但没有解释为什么在补丁后更改它。我们有几台带有安全更新的机器,还有几台没有。在任何情况下,那些有更新的人都会打开解决方案(在源代码控制的多个分支中),并且 Copy Local 为 False。对于那些没有打补丁的机器,Copy Local 设置为 True,就像在源代码管理中一样。 【参考方案1】:

天哪,感谢@Nevada-Williford 的提示。进入并将我的System.Web.Mvc 引用设置为&lt;Private&gt;True&lt;/Private&gt; (Copy Local = True) 修复了它。请注意,在更新之前一切正常,更新之后我必须修改我的 csproj 以使其再次工作。

工作原理:

Copy Local = True&lt;Private&gt;True&lt;/Private&gt;曾经差不多,but not exactly, the same thing.前者是Visual Studio设置,后者是msbuild设置。如果缺少 msbuild 设置,则将应用 Visual Studio 设置(只要您在 VS 中)。在这次更新中,我认为他们改变了它,所以 Copy Local 只是反映了存在属性。

在我们的项目中,我们没有明确设置该属性,但Copy Local = True 因此在更新之前System.Web.Mvc.dll 被复制到bin 目录。更新后,由于缺少Copy Local 属性显示False,您必须将其设置为True 以确保您获得本地副本。

手动设置 Copy Local = True(或将该 xml 元素添加到 msbuild)可以解决此问题。

编辑:虽然这似乎是特定问题的答案,但任何来到这里的人都应该阅读评论线程和其他答案 - 特别是 dmatson 的 - 以了解更多上下文、警告和相关错误。

【讨论】:

有点道理。看起来像(强制)迁移和 vNext 项目的一部分,其中解决方案依赖于来自框架的更少依赖项。 哦,完全有道理,而且做出了更好的改变,但是一个不为人知的带外更新需要对现有代码进行更改?真的很糟糕的形式。 值得注意的是,这也会破坏已设置 Copy Local = True 的现有项目。至少对我来说,该项目不再在本地复制程序集。切换到 Copy Local = false,保存,然后返回 true 并保存修复它。 This seems like some sort of confirmation 这很容易破坏您在 CI 服务器上的构建,前几天当我的服务器更新并抛出此错误但在本地它正在工作(尚未在本地收到更新)时,我把垃圾弄糊涂了【参考方案2】:

MS14-059 对任何没有 CopyLocal=true(或者,在 MSBuild 中,&lt;Private&gt;True&lt;/Private&gt;)的用户来说,这已被破坏。默认情况下,MVC 模板确实设置了&lt;Private&gt;True&lt;/Private&gt;,但如果您使用 NuGet 更新 MVC 版本,则会丢失该设置(请参阅NuGet bug #4344)。

问题有两个方面:

    默认情况下,Razor 不包含对 MVC 的引用,因此除非您的 bin 文件夹中存在某些版本的 MVC DLL,否则它的编译将无法进行。 如果您部署到未安装此更新的单独计算机,则 MVC DLL 将不再包含在您的输出中,因此 MVC 将丢失。

您看到了问题 #1。要解决这两个问题,我建议进行以下两项更改:

    将以下配置添加到 Views\Web.config:

    <system.web>
      <compilation>
        <assemblies>
          <add assembly="System.Web.Mvc, Version=5.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" />
        </assemblies>
      </compilation>
    </system.web>
    

    在 VS UI 中设置 CopyLocal=true 以供项目参考,或在 .csproj 文件的 Reference 下方手动添加以下行:

    <Private>True</Private>
    

所以您的完整参考应该如下所示:

<Reference Include="System.Web.Mvc, Version=5.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL">
  <Private>True</Private>
  <HintPath>..\..\packages\Microsoft.AspNet.Mvc.5.0.0\lib\net45\System.Web.Mvc.dll</HintPath>
</Reference>

请注意,如果您以后再次更新包,NuGet 将删除 CopyLocal/Private 设置。 (例如,如果您今天更新到 MVC 5.2)。如果该版本的 MVC 曾经是 GAC'd,只要您在上面的步骤 A 中添加了配置,上面的问题 #1 就不会再次出现,但问题 #2 仍然可能再次发生。为确保将来不会发生这种情况,我建议您在进行 NuGet 包更新时手动将 CopyLocal 设置回 true。

【讨论】:

天哪,太可怕了。请大家为那个 nuget 错误投票。 设置CopyLocal=true对我们没有帮助;见:System.Web.MVC not copied to bin folder since MS14-059 @DannyTuppeny 是项目文件中标记为&lt;private&gt;true&lt;/private&gt; 的引用吗? @GeorgeMauer 查看我对该帖子的更新;它缺少 private=true,但是升级到 MVC 5.2.2 修复了它,并且没有在那里引入任何更改:-/【参考方案3】:
    您可以转到当前项目的参考资料。 右键单击 dll System.Web.Mvc 并选择属性 将打开一个属性窗口 将复制本地更改为True

【讨论】:

感谢它的工作,但它是如何解决的只是不明白!你能稍微描述一下它是如何解决的吗?【参考方案4】:

设置 CopyLocal=true 没有帮助。清洁解决方案然后关闭它并再次重新打开它有效。您可能还需要关闭整个 Visual Studio 实例。

【讨论】:

这实际上对 csproj 文件做了什么? CopyLocal=true 现在应该只是一个用于更改 csproj 文件的 ui。 不确定它对 csproj 文件做了什么。与其他开发人员报告的一样,CopyLocal 也已设置为 true。但是,我只知道在关闭解决方案或 Visual Studio 实例并再次重新打开后,错误消失了。 清理和重建解决方案对我有用。谢谢你的建议【参考方案5】:

这似乎是由 Windows 更新 (KB2990942) 引起的,以修复安全漏洞 MS14-059,允许绕过安全功能。安装 Windows 更新后,我们的构建在构建服务器上停止工作,更新 csproj 文件以使用 4.0.0.1 作为 System.Web.Mvc 参考解决了该问题。

微软对该漏洞的描述是:

如果攻击者诱使用户单击特制链接或访问包含旨在利用该漏洞的特制内容的网页,则该漏洞可能允许绕过安全功能。在基于 Web 的攻击情形中,攻击者可能拥有一个旨在通过 Web 浏览器利用该漏洞的特制网站,然后诱使用户查看该网站。攻击者还可以利用受感染的网站和接受或托管用户提供的内容或广告的网站。这些网站可能包含可利用此漏洞的特制内容。然而,在所有情况下,攻击者都无法强迫用户查看攻击者控制的内容。相反,攻击者必须说服用户采取行动,通常是让他们点击电子邮件或即时消息中的链接,将他们带到攻击者的网站,或者让他们打开通过电子邮件发送的附件.

【讨论】:

Soooo....这基本上只是说“这是一个可以通过网页攻击用户的漏洞”,对吗?相当无用的描述。【参考方案6】:

除了在项目参考中设置 CopyLocal=true 外,您可能还需要像这样更改 Web.Config 文件...

  <dependentAssembly>
    <assemblyIdentity name="System.Web.Mvc" publicKeyToken="31bf3856ad364e35" culture="neutral" />
    <bindingRedirect oldVersion="0.0.0.0-4.0.0.0" newVersion="4.0.0.1" />
  </dependentAssembly>

注意 newVersion="4.0.0.1"。这对我有用,我希望它也能帮助一些人。

保存在任何测试/生产服务器上更新 MVC 框架。

微软干杯。你是最好的!

你试图让我在我的客户面前显得无能的企图再次被挫败!

【讨论】:

这只有在你本地或 gac 中可用的 mvc 版本时才有效 CopyLocal=True 会将本地副本放入 bin 文件夹并从中运行。只需确保将其上传到测试/生产服务器上应用程序的 bin 文件夹即可。 让我在那里纠正你,你的项目文件中的&lt;private&gt;true&lt;/private&gt; 将强制它被复制。 Copy Local = True有时强制复制它,因为整个功能都是错误的。不幸的是,正如其他人提到的,如果您从 nuget 更新,一个不相关的 nuget 错误将删除 &lt;private&gt;True&lt;/private&gt; 设置,您将不得不手动重新添加它。 我个人不使用 nuget 来引用系统命名空间,因为这似乎有点令人费解,正如您刚刚指出的那样,您提到的“buggyness”。不过各有各的哎!这对我很有用,希望能给其他人一些启发。【参考方案7】:

除了在项目参考中设置CopyLocal=true,您可能还需要像这样更改Web.Config文件...

<dependentAssembly>
  <assemblyIdentity name="System.Web.Mvc" publicKeyToken="31bf3856ad364e35" culture="neutral" />
  <bindingRedirect oldVersion="0.0.0.0-4.0.0.0" newVersion="4.0.0.1" />
</dependentAssembly>

我也添加了culture="neutral",这一切都解决了问题。

【讨论】:

以上是关于Windows 更新后“命名空间‘System.Web.Mvc’中不存在类型或命名空间名称‘Html’”的主要内容,如果未能解决你的问题,请参考以下文章

Creators Update 后 Windows 10 终于不会自说自话更新重启了

Windows 更新后不需要的 C++ 项目重建

Windows 7停止支持后,如何免费获得安全更新?

Windows 更新 1903 后 Composer 无法使用 laravel

Windows 2004 更新后无法以其他用户身份运行 EXCEL.EXE

TIdHttpServer 在 Windows 更新后 Active 设置为 False 时冻结