3.0.0.1版ASP.NET MVC安全修补程序中断了构建
安装ASP.NET MVC 3安全更新后,MVC版本似乎从3.0.0.1版ASP.NET MVC安全修补程序中断了构建,.net,asp.net-mvc,versioning,assembly-references,assembly-binding-redirect,.net,Asp.net Mvc,Versioning,Assembly References,Assembly Binding Redirect,安装ASP.NET MVC 3安全更新后,MVC版本似乎从3.0.0.0增加到3.0.0.1。这将导致Visual Studio不再找到引用 <Reference Include="System.Web.Mvc, Version=3.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL" /> Resharper没有显示任何问题,但构建失败,出现大量未解决的MVC类
3.0.0.0
增加到3.0.0.1
。这将导致Visual Studio不再找到引用
<Reference Include="System.Web.Mvc, Version=3.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL" />
Resharper没有显示任何问题,但构建失败,出现大量未解决的MVC类型和警告:
警告:无法解析此引用。找不到服务器
程序集“System.Web.Mvc,版本=3.0.0.0,区域性=中性,
PublicKeyToken=31bf3856ad364e35,processorArchitecture=MSIL”。核对
确保磁盘上存在该程序集。如果需要此参考
根据您的代码,可能会出现编译错误
这是有道理的。我的计算机上不再存在此版本
我不能保证开发机器、构建服务器和生产服务器上的MVC版本是准确的。它们可能具有3.0.0.0
或3.0.0.1
,并且这可能随时发生变化。Windows Update可能随时发布新的MVC版本。此外,我不想在发布MVC更新时增加所有*.csproj文件中的版本号
更新会影响多个版本:
- 删除MVC引用并向项目添加正确的引用
- 将引用的
属性更改为Copy Local
true
- 更新
中的web.config
设置:bindingRedirect
运行时
部分:
<runtime>
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
<dependentAssembly>
<assemblyIdentity name="System.Web.Mvc" publicKeyToken="31bf3856ad364e35" />
<bindingRedirect oldVersion="1.0.0.0-3.0.0.0" newVersion="3.0.0.1" />
</dependentAssembly>
...
...
发布项目时,更改Copy Local
设置将在bin
文件夹中包含System.Web.MVC.dll
文件,以便即使服务器未使用新版本更新,该文件也能正常工作
请注意,像这样的更新很少发生。这是MVC 3发布以来首次进行修补。更新服务器后,您应该能够将
复制本地
更改回错误
。下次Microsoft进行这样的更新时,他们可能会首先知道如何修复此类问题。由于热修复程序将配置文件(system.Web.Mvc.dll.config)传递到以下文件夹中,因此您的生产系统应该是正常的:
%SystemRoot%\assembly\GAC_MSIL\policy.3.0.System.Web.Mvc\3.0.0.1__31bf3856ad364e35
配置文件包含指向新版本的程序集重定向,这将覆盖web.config中的任何内容:
<?xml version="1.0"?>
<!-- http://msdn.microsoft.com/en-us/library/7wd6ex19.aspx#BKMK_Redirectingassemblyversionsbyusingpublisherpolicy -->
<configuration>
<runtime>
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
<dependentAssembly>
<assemblyIdentity name="System.Web.Mvc" publicKeyToken="31bf3856ad364e35" culture="neutral" />
<bindingRedirect oldVersion="3.0.0.0-3.0.0.1" newVersion="3.0.0.1"/>
</dependentAssembly>
</assemblyBinding>
</runtime>
</configuration>
按照@Guffa为您的构建系统提供的建议进行操作,或者使用nuget进行更新。我相信,有效的解决方案取决于如何将MVC二进制文件交付到系统(bin deploy或GAC)。我使用Nuget在项目中安装了Microsoft.AspNet.MVC软件包
Install-Package Microsoft.AspNet.Mvc -Version <version> -Project PROJECTNAME
MVC 4 version: 4.0.40804.0
MVC 3 version: 3.0.50813.1
安装软件包Microsoft.AspNet.Mvc-版本-项目名称
MVC4版本:4.0.40804.0
MVC 3版本:3.0.50813.1
这解决了问题。详情如下:
在我的案例中,有效的方法是更改项目文件中的
引用
元素,因此版本=3.0.0.0
现在是版本=3.0.0.1
。我还将\u bin_deployableAssemblies
文件夹中的System.Web.Mvc.dll
文件更新为新版本,并在参考
元素中添加了一个指向所述dll的HintPath
元素,这样即使在GAC中我们仍然有3.0.0.0版,它也会被选中
棘手的部分是不要忘记在所有引用
System.Web.Mvc
(例如,包括测试项目)的项目中更新引用。今天的4.0.0.1版本中,我们只是重新引用了System.Web.Mvc。最好有一个更健壮的引用解决方案。您至少应该能够保证构建服务器和生产服务器在相同的环境中运行。开发人员的机器可能会失去同步,但您可以在出现此类问题时进行处理。您的生成服务器应该会发现任何问题。@Stijn我计划这样做,但我不能保证更新会在同一时间发生。开发过程必须在没有人工干预的情况下独立工作几周。MVC3并没有中断生产。在GAC中,我找到了一个带有绑定重定向的“System.Web.Mvc.dll.config”。显然,CLR.Related正在使用这个文件:除了更改引用的copy-local属性之外,我也做了同样的操作。这似乎使我的项目能够正常工作。请注意,这些修补程序不会显示为已安装的更新,您必须查看Asp.Net MVC(显示在“正常添加-删除程序”下),它将在应用修补程序时有一个安装日期(对于我而言,2014年10月15日)@EricBrown Cal:您是指服务器版本更新吗?在我的计算机上,它显示为已安装的更新。设置CopyLocal=true
对我们没有帮助;请看:这部分解决了我的问题,因为我的解决方案再次建立。但是,它现在向我显示了几个警告:假设程序集引用'System.Web.Mvc,Version=3.0.0.0,Culture=neutral,PublicKeyToken=31bf3856ad364e35'匹配'System.Web.Mvc,Version=3.0.0.1,Culture=neutral,PublicKeyToken=31bf3856ad364e35',您可能需要提供运行时策略
在我的系统上找不到此文件。有关于此信息的参考吗?@julian因为它是gac,所以您可能必须使用提升的命令提示符遍历目录。另外,我相信这只适用于安装了mvc的情况,如果你安装了nuget(bin deploy)mvc,那么这可能不会出现在你的系统上。有趣的是,你可以(1)应用更新并获取此配置文件,然后(2a)返回并将其nuget包更新到最新版本,以及(2b)忘记或失败(例如从