3.0.0.1版ASP.NET 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类

安装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类型和警告:

警告:无法解析此引用。找不到服务器 程序集“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更新的安全?

我通过以下方式解决了此问题:

  • 删除MVC引用并向项目添加正确的引用
  • 将引用的
    Copy Local
    属性更改为
    true
  • 更新
    web.config
    中的
    bindingRedirect
    设置:
web.config
运行时
部分:

<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)忘记或失败(例如从