【问题标题】:Window Update Broke MVC Application窗口更新破坏了 MVC 应用程序
【发布时间】:2014-12-13 00:53:55
【问题描述】:

我昨天运行了 Windows 更新,当我尝试发布我的 ASP.NET MVC 4 项目的新版本时,它引入了一些问题。

应用程序在本地编译和运行正常,但是当我将版本推送到我的网络服务器上的测试站点时,它因错误消息而崩溃:

System.Web.HttpCompileException: (0): error CS1705: Assembly 'App_Code, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null' uses 'System.Web.Mvc, Version=4.0.0.1, Culture=neutral, PublicKeyToken=31bf3856ad364e35' which has a higher version than referenced assembly 'System.Web.Mvc, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35'

经过一些研究,我发现这是由于从 4.0.0.0 更新到 4.0.0.1。我从我的项目中删除了 System.Web.Mvc dll 并读取了具有更高版本的 dll。同样,一切都在本地工作,但不在网络上。然后,我浏览了 web.config 并将任何提及 4.0.0.0 的内容更改为 4.0.0.1。同样,这继续在内部工作,但在外部失败。错误信息是:

无法加载文件或程序集“System.Web.Mvc,Version=3.0.0.0,Culture=neutral,PublicKeyToken=31bf3856ad364e35”或其依赖项之一。找到的程序集的清单定义与程序集引用不匹配。 (来自 HRESULT 的异常:0x80131040) 说明:执行当前 Web 请求期间发生未处理的异常。请查看堆栈跟踪以获取有关错误及其源自代码的位置的更多信息。 异常详细信息:System.IO.FileLoadException:无法加载文件或程序集“System.Web.Mvc,Version=3.0.0.0,Culture=neutral,PublicKeyToken=31bf3856ad364e35”或其依赖项之一。找到的程序集的清单定义与程序集引用不匹配。 (来自 HRESULT 的异常:0x80131040) 源错误: 在执行当前 Web 请求期间生成了未处理的异常。可以使用下面的异常堆栈跟踪来识别有关异常起源和位置的信息。 程序集加载跟踪:以下信息有助于确定为什么无法加载程序集“System.Web.Mvc, Version=3.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35”。 警告:程序集绑定日志记录已关闭。 要启用程序集绑定失败日志记录,请将注册表值 [HKLM\Software\Microsoft\Fusion!EnableLog] (DWORD) 设置为 1。 注意:有一些与程序集绑定失败日志相关的性能损失。 要关闭此功能,请删除注册表值 [HKLM\Software\Microsoft\Fusion!EnableLog]。

我相信这与我用于错误处理的 Elmah 有关。

我尝试按照此处的建议从 Nuget 重新安装:Windows update caused MVC3 and MVC4 stop working,但这没有奏效,我遇到了同样的错误。

添加信息: 服务器尚未更新,我担心更新它可能会破坏现有的实时版本。

【问题讨论】:

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


【解决方案1】:

错误消息告诉我,您在其中一个配置文件中为 MVC 程序集指定了错误的版本号。找到版本不正确的配置文件并将其更改为匹配您使用的任何版本(您在上面提到了 4.0.0.1)。您需要检查所有配置文件,包括

  • 项目根目录中的那个
  • Views 文件夹中的那个

您也可以在配置文件中添加assembly redirect 来解决这个问题——如果它由于第三方库而失败,这可能是最合适的操作。

根据您的反馈 ID 建议使用绑定重定向。将此添加到您的主 web.config..

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

【讨论】:

  • 感谢您的回复。我已经对整个解决方案进行了查找,并且所有 System.Web.MVC 都已更改。还有其他人正在关注 4.0.0.0,例如 System.Data.Entity。错误消息还提到了 3.0.0.0,我在解决方案中的任何地方都找不到。
  • @Jay1b 试一试绑定重定向,我已经更新了我的帖子以显示您必须添加什么才能使其正常工作。
  • 在我的帖子和你的帖子之间,我已经做到了。已经从 oldVersion="4.0.0.0-4.0.0.1" 设置了重定向,我将其更改为 oldVersion="3.0.0.0-4.0.0.1" 并在您发布后尝试将其更改为 oldVersion="1.0.0.0-4.0。 0.1"。还是没有运气。
  • 谢谢,这已经解决了这个问题。奇怪的是,我不得不重新启动 IIS 进程,然后它才开始工作。
【解决方案2】:

我遇到了类似的问题,MS 更新将 MVC.dll 从 3.0.0.0 更改为 3.0.0.1。我需要维护我的软件的各种版本,为了确保兼容性,我不得不将 3.0.0.0 dll 复制到我的项目中,并在构建项目之前在那里引用它。

【讨论】:

    【解决方案3】:

    在深入挖掘之后,我发现视图文件夹中的 web.config 指向不同的版本 System.web.mvc 。一旦我改为

    <host factoryType="System.Web.Mvc.MvcWebRazorHostFactory, System.Web.Mvc, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" /> 
    

    来自

    <host factoryType="System.Web.Mvc.MvcWebRazorHostFactory, System.Web.Mvc, Version=4.0.0.1, Culture=neutral, PublicKeyToken=31BF3856AD364E35" />
    

    将 System.Web.MVC 的版本从 4.0.0.1 更改为 4.0.0.0 我能够解决这个问题。

    【讨论】:

      猜你喜欢
      • 2018-03-31
      • 1970-01-01
      • 2019-08-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-10-24
      • 1970-01-01
      相关资源
      最近更新 更多