Windows更新后“名称空间”System.Web.Mvc“中不存在types或名称空间名称”Html“

我做了一个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。 为什么会这样呢? 我该如何解决?

让我清楚,没有configuration,甚至代码的变化。 这一切都在IISExpress上的我的开发机器上。 它正在运行,我做了更新,并重新启动,现在不再运行。

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

从更新安装

神圣的废话,感谢@内华达威利福德的暗示。 进入并设置我的System.Web.Mvc引用到<Private>True</Private> (复制本地= True)修复它。 请注意,更新之前一切正常,更新后,我不得不修改我的csproj让它再次工作。

正在发生的工作理论:

Copy Local = True<Private>True</Private>曾经差不多, 但不完全一样。 前者是Visual Studio设置,后者是msbuild设置。 如果msbuild设置不存在,则将应用Visual Studio设置(只要您在VS中)。 在这个更新,我认为他们改变了,所以Copy Local只是反映了存在的属性。

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

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

编辑:虽然这似乎是对具体问题的答案,任何来这里的人都应该阅读评论主题和其他答案 – 特别是dmatson的 – 更多的上下文,警告和相关的错误。

对于CopyLocal=true没有CopyLocal=true任何用户(或者在MSBuild中说, <Private>True</Private> ),这都被破坏了 。 MVC模板默认设置为<Private>True</Private> ,但是如果使用NuGet更新MVC版本,则会丢失该设置(请参阅NuGet bug#4344 )。

这个问题有两个方面:

  1. Razor默认不包含对MVC的引用,所以它的编译将无法工作,除非你的bin文件夹中存在一些版本的MVC DLL。
  2. 如果您部署到没有安装此更新的单独机器,则MVC DLL不会包含在您的输出中,所以MVC将会丢失。

你看到问题#1。 为了解决这两个问题,我build议进行以下两个更改:

  1. 将以下configuration添加到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> 
  2. 在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中添加了configuration,上面的问题#1就不会再发生,但问题#2仍然可能再次发生。 为了确保将来不会发生这种情况,我build议您在任何时候执行NuGet软件包更新时手动将CopyLocal设置回true。

  1. 你可以去当前项目的参考。
  2. 右键单击DLL System.Web.Mvc并select属性
  3. 属性窗口将打开
  4. 将本地复制更改为True

设置CopyLocal = true没有帮助。 清洁解决scheme,然后closures它,重新打开它再次工作。 您可能还需要closures整个Visual Studio实例。

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

微软对这个漏洞的描述是:

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

以及在项目引用中设置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”。 这对我有用,我希望它也帮助一些人。

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

欢呼微软。 你是最好的!

你在我的客户面前让我看起来不称职的企图再次被挫败了!

以及在项目引用中设置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" ,这一切都解决了这个问题。