我收到了一个需要修改的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版,以便在部署到生产环境时,我不会遇到此问题。
答案 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将使您的项目在具有该补丁和不具有该补丁的机器上进行编译。
System.Web.Mvc
的引用,并将其替换为以下元素。<!-- 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才能使用上述内容,或者您需要根据需要调整版本号以匹配您的版本。