今天早上,据报道,我们的QA服务器上的web应用程序已完全损坏,网络报告了以下错误.配置:

无法加载文件或程序集"System.Web.Mvc,版本=5.1.0.0,区域性=中性,PublicKeyToken=31bf3856ad364e35"或其依赖项之一.系统找不到指定的文件

记得看到一个提到MVC的Windows更新,我做了一些挖掘,发现lots of people reporting最近的一个Windows更新 destruct 了MVC.

在对这些问题和我们的服务器进行了大量挖掘之后,似乎咬我们的东西与其他问题中的东西不匹配,但看起来确实相关.以下是我们想知道的:

  • 我们损坏的应用程序使用的是ASP.NET MVC 5.1
  • MVC是通过NuGet安装的
  • 我们的BuildServer和QA服务器没有安装MVC 5.1(因此,不是GAC'd)

我们认为的 destruct 导致了"坏建筑"的产生:

  • 已通过Windows Update despite not having MVC 5.1 installed in the GAC在BuildServer上安装了MVC 5.1的修补程序
  • 该补丁已将MVC 5.1的"更新"版本放入GAC
  • 当DLL位于GAC中时,忽略CopyLocal=true;因此,自补丁发布以来,这意味着我们的应用程序将从BuildServer no longer have System.Web.MVC in the output folder中构建
  • 因为System.Web.MVC不在我们的QA服务器上的GAC中(它们还没有打补丁),所以应用程序现在失败,因为找不到System.Web.MVC

假设上述行为是正确的,这意味着任何时候MS service通过Windows Update that we do not have in the GAC创建NuGet DLL时,我们的BuildServer都将开始生成不完整的构建(丢失已注入GAC的DLL).

升级到MVC 5.2解决了这个问题(可能是因为它没有打补丁,因此没有注入GAC);DLL现在被复制到输出文件夹.在升级到5.2.2的diff中,除了版本号更改之外没有任何更改(特别是没有添加/编辑<Private>个 node ).

我们不希望开始把所有东西都打开,也不希望创建手动构建步骤,将所有DLL复制到bin文件夹中,以防MS修补它们.

那么,如果将来MS修补其他DLL,我们可以通过更改today来确保我们不会以Out BuildServer默默地生成不好的构建而告终呢?

推荐答案

尽管GAC中没有安装MVC 5.1,但通过Windows Update在BuildServer上安装了MVC 5.1补丁

是的,这种行为实际上是故意的.见http://blogs.msdn.com/b/dotnet/archive/2014/01/22/net-4-5-1-supports-microsoft-security-updates-for-net-nuget-libraries.aspx.


该修补程序已将MVC 5.1的"更新"版本放入GAC

是的,这是正确的;补丁程序就是这样让更新后的代码而不是旧代码运行的.请参见https://technet.microsoft.com/en-us/library/security/ms14-059.


当DLL位于GAC中时,将忽略CopyLocal=true;因此,从修补程序开始,这意味着从BuildServer构建的应用程序在输出文件夹中不再具有System.Web.MVC

不完全是.实际发生的情况是,以前为CopyLocal=true的项目被切换为CopyLocal=false.CopyLocal可以通过以下两种方式之一进行设置:1)如果数据库中有显式的<Private>True</Private>设置.csproj文件,或2)默认情况下,如果不存在此类设置(默认情况下,GAC的程序集不复制本地;其他程序集则不复制本地).

因此,在本例中出现的情况是,您的项目文件在csproj文件中没有此设置.因此,GUI显示了基于补丁之前判断的默认值的设置(CopyLocal=true),但在安装补丁之后,GUI现在将显示GAC程序集的新默认值(CopyLocal=false).


因为System.Web.MVC不在我们的QA服务器上的GAC中(它们还没有打补丁),所以应用程序现在失败,因为找不到System.Web.MVC

没错.


假设上述行为是正确的,这意味着任何时候MS service通过Windows Update创建一个GAC中没有的NuGet DLL时,我们的BuildServer将开始生成不完整的构建(丢失已注入GAC的DLL).

无论如何.csproj参考没有明确的<Private>True</Private>设置,这是正确的.另外,请注意,使用NuGet更新MVC引用可以删除此设置,即使它以前存在.见http://nuget.codeplex.com/workitem/4344.


升级到MVC 5.2解决了这个问题(可能是因为它没有打补丁,因此没有注入GAC);DLL现在被复制到输出文件夹.升级到5.2.2的diff中没有任何更改,除了版本号更改(特别是没有添加/编辑 node ).

没错. Since MVC 5.2 is not GAC'd, even without an explicit <Private>True</Private> setting, the default value of this non-GAC'd assembly will be CopyLocal=true.


我们不希望开始对所有内容进行GAC,也不希望创建手动构建步骤将所有DLL复制到bin文件夹中,以防MS修补它们. 那么,如果将来MS修补其他DLL,我们今天可以做些什么来确保我们不会因为Out BuildServer而默默地生成不好的构建呢?

你今天能做的最好的事情是:

  1. 在你的电脑中设置<Private>True</Private>个明确的设置.用于所有NuGet包程序集引用的csproj文件.
  2. 在修复NuGet bug#4344之前,任何时候使用NuGet更新包引用时,都要回到您的应用程序中.csproj文件并重新添加显式<Private>True</Private>设置.

Asp.net相关问答推荐

页面刷新后如何存储JS Select 数据

如何向 Array.IndexOf 添加不区分大小写的选项

Web API Queryable - 如何应用 AutoMapper?

如何在 GridView 单元格中的(即
)中呈现解码的 HTML

IIS Request.UserHostAddress 返回 IPV6 (::1),即使禁用了 IPV6

asp.net:与其中的用户控件相比,控件/页面的页面生命周期顺序是什么?

使用 IIS 的 ASP.NET 调试超时

无法加载文件或程序集 'System.Web.Mvc,版本 = 3.0.0.0,Elmah.MVC 问题

如何使用 javascript 调用 ASP.NET c# 方法

Razor 主机工厂错误

ASP.NET 中的多选下拉列表

在asp.net mvc 3中实现FilterAttribute,IActionFilter和从ActionFilterAttribute继承有什么区别?

用于呈现

通过 ASP.NET/C# 使用 Plupload

带有模型的 ASP.NET MVC 重定向

如何遍历自定义 vb.net 对象的每个属性?

如何将我的 DDD 模型中的用户与身份验证用户集成?

在后面的代码中删除 css 类

将 HTML 字符串转换为图像

判断 IQueryable 结果集的最佳方法是什么?