将对System.Web.Mvc的引用还原为版本3.0.0.0

时间:2016-02-06 07:03:44

标签: asp.net-mvc visual-studio-2010

我收到了一个需要修改的ASP.NET MVC应用程序,该应用程序使用System.Web.Mvc 3.0.0.0版。但是当我在dev机器上复制文件时,我注意到我对System.Web.Mvc的引用被破坏了。所以我的第一直觉是删除引用并将其添加回来,这很好。我的应用程序编译。但是我注意到在此更改之后它现在引用了3.0.0.1版。

问题在于:客户端的生产服务器版本为3.0.0.0,因此当我在服务器上部署它时,我收到错误消息,说它无法找到3.0.0.1。

如何更改我的开发计算机以使用System.Web.Mvc 3.0.0.0版,以便在部署到生产环境时,我不会遇到此问题。

1 个答案:

答案 0 :(得分:1)

Microsoft发布了Microsoft Security Bulletin MS14-059,这是一个非常关键的安全问题,它们破坏了以前版本的MVC 3和4的向后兼容性。由于问题很关键,因此无法将机器恢复到3.0 .0.0

但是,这也使得与MVC 3.0.0.1一起工作的项目无法在安装了MVC 3.0.0.0的计算机上编译。这将完全删除已安装到全局程序集缓存中的MVC 3.0.0.0。

另一方面,MVC 3.0.0.1是通过NuGet部署的,你需要添加一个引用并重新编译它,以便补丁工作(如果你还没有这样做)。

最佳解决方案

正确的解决方案是在目标计算机上安装the patch

可能的替代方案

但是,如果该机器(或您的构建服务器)不受您的控制,那么下面的hack将使您的项目在具有该补丁和不具有该补丁的机器上进行编译。

  1. 右键单击解决方案资源管理器中的项目节点(引用MVC 3的节点),然后单击“卸载项目”。
  2. 再次右键单击它并选择“编辑”。
  3. 找到System.Web.Mvc的引用,并将其替换为以下元素。
  4. 保存项目文件。
  5. 再次右键单击项目节点,然后单击“重新加载项目”。
  6. <!-- Due to the windows update MS14-059, we need this hack to ensure we can 
    build MVC3 both on machines that have the update and those that don't -->
    <Reference Condition=" Exists('$(windir)\Microsoft.NET\assembly\GAC_MSIL\System.Web.Mvc\v4.0_3.0.0.0__31bf3856ad364e35\System.Web.Mvc.dll') " Include="System.Web.Mvc, Version=3.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL" />
    <Reference Condition=" !Exists('$(windir)\Microsoft.NET\assembly\GAC_MSIL\System.Web.Mvc\v4.0_3.0.0.0__31bf3856ad364e35\System.Web.Mvc.dll') " Include="System.Web.Mvc, Version=3.0.0.1, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL">
      <Private>True</Private>
      <HintPath>..\packages\Microsoft.AspNet.Mvc.3.0.20105.1\lib\net40\System.Web.Mvc.dll</HintPath>
    </Reference>
    

    请注意,您需要使用MVC NuGet package installed for version 3.0.20105.1才能使用上述内容,或者您​​需要根据需要调整版本号以匹配您的版本。