如何处理从ASP MVC版本4.0.0.0到4.0.0.1的转换

时间:2014-10-22 11:29:58

标签: asp.net-mvc asp.net-mvc-4 windows-update

这是Windows update caused MVC3 and MVC4 stop working

的后续内容

我还遇到了我的开发机器上的Windows更新导致我的MVC 4项目停止工作的问题。我将程序集引用更改为目标版本4.0.0.1,它开始工作。对我来说。

我的问题是该应用程序随后部署在许多Web服务器上。实际上,我们有一个构建服务器,其中构建了客户版本,然后是一些Web服务器。

第一个问题:当我们在生产服务器上运行Windows更新时,旧版本的应用程序将停止工作吗?我猜答案是“是”。我们还没有在构建或生产机器上运行Windows更新。

更改引用意味着它不再可以在构建计算机上构建。我可以通过将Specific Version标志设置为false并将Local Local设置为true来解决此问题。然后它建立在我的开发环境和构建服务器上。

问题:如果我的特定版本为假,检查有多松散?它是否允许4.0.0.x? 4.0.x.x? 4.x.x.x?或x.x.x.x?

然而,它甚至在thsi配置中构建它然后无法在测试Web服务器上运行(无法找到程序集)。这里的问题是我的web.config中有以下内容(根据我从MVC 2升级到MVC 4时的微软说明):

<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
  <dependentAssembly>
    <assemblyIdentity culture="neutral" name="System.Web.Mvc" publicKeyToken="31BF3856AD364E35"/>
    <bindingRedirect newVersion="4.0.0.1" oldVersion="0.0.0.0-4.0.0.1"/>
  </dependentAssembly>
  <dependentAssembly>
    <assemblyIdentity name="System.Web.Helpers" publicKeyToken="31bf3856ad364e35"/>
    <bindingRedirect newVersion="2.0.0.0" oldVersion="1.0.0.0"/>
  </dependentAssembly>
  <dependentAssembly>
    <assemblyIdentity name="System.Web.Mvc" publicKeyToken="31bf3856ad364e35"/>
    <bindingRedirect newVersion="4.0.0.0" oldVersion="1.0.0.0-3.0.0.0"/>
  </dependentAssembly>
  <dependentAssembly>
    <assemblyIdentity name="System.Web.WebPages" publicKeyToken="31bf3856ad364e35"/>
    <bindingRedirect newVersion="2.0.0.0" oldVersion="1.0.0.0"/>
  </dependentAssembly>
</assemblyBinding>

问题在于

<bindingRedirect newVersion="4.0.0.1" oldVersion="0.0.0.0-4.0.0.1"/>

用于System.Web.Mvc程序集。 (当然,在该行中,4.0.0.0而不是4.0.0.1。)如果我在测试服务器上更改回4.0.0.0,那么它可以正常工作。

我的问题是双重的。部分原因是我希望能够在本地和我们的构建/生产服务器上构建和运行。但是,我们遇到一些情况,我们在同一台服务器上托管了许多运行不同版本应用程序的客户。我们不能强迫所有客户立即升级到最新版本只是因为这个Windows更新修复 - 除了Web应用程序只是更大的应用程序套件的一部分,所以我们必须强制他们升级这个批次! / p>

我想一个选项是检查每个仍在使用的旧版本,更新MVC版本号并创建一个新版本。然后,当我们更新Web服务器时,我们必须将该服务器上的所有客户更新为其当前版本的新(4.0.0.1兼容)版本。我真的很想避免在可能的情况下更新,提交和重建那么多版本。

另一个选择是不在Web服务器上运行Windows更新,并尝试在构建计算机上安装4.0.0.0和4.0.0.1 dll。然后我们可以构建新旧版本。由于任何新版本(使用4.0.0.1)都在MVC程序集上将CopyLocal设置为true(旧版本没有),因此它们应该能够部署到Web服务器,而不会更新Web服务器。

问题:

  • 有谁知道是否可以同时安装两个版本?我希望我可以简单地保存4.0.0.0 dll,运行Windows更新然后复制到旧的dll回到GAC旁边新。
  • 此修补程序修复的安全风险有多严重?允许人们运行旧版本一段时间是一个问题吗?只是让Web服务器上的旧.dll存在安全风险,或仅针对使用它的应用程序?
  • 有没有办法做bindingRedirect到4.0.0.x?还是可以简单地删除绑定重定向?

我无法相信我是这种情况下唯一的人,也欢迎任何我根本没想过的解决方案的建议。

1 个答案:

答案 0 :(得分:0)

我是一个团队成员,从一个稍微不同的角度遇到同样的问题。它在安全更新错误时发布的错误消息可能会产生误导并且难以解释。当我们尝试将应用程序发布到不同的环境时,我们遇到了部署和构建错误。根本原因是这个补丁是通过某些测试环境中的Windows更新应用的,而不是在其他服务器上应用的。当我们部署应用程序时,任何没有补丁的服务器都会崩溃。我建议让您的系统团队应用补丁并升级所有应用程序以引用此DLL。 Security updates因为引用的库在源代码管理中被忽略,但仍然在Web配置中详细说明,需要快速解决。某些环境允许您右键单击并选择在本地使用哪个MVC DLL版本,并仍然可以毫无问题地部署您的应用程序。如果您正在使用Web部署,并且必须能够切换,您可以为每个Transforms web config编写Web配置转换。在修复此问题(升级到4.0.0.1)时我注意到的一件事是在我的项目中升级到最新版本的MVC.dll允许我获取最新版本的nuget包。如果您不升级并保留旧版本,您将无法使用旧版本的MVC javascript,jquery和其他库。