16

我有一个网站偶尔会抛出以下错误:

“/”应用程序中的服务器错误。

无法加载文件或程序集 'ICSharpCode.SharpZipLib, Version=0.85.3.365, Culture=neutral, PublicKeyToken=1b03e6acf1164f73' 或其依赖项之一。找到的程序集的清单定义与程序集引用不匹配。(来自 HRESULT 的异常:0x80131040)

现在我知道我确实依赖于这个 DLL,但我的系统上有 0.85.5 版本。我系统地从服务器中删除了所有旧版本的 DLL,重新编译所有内容并重新发布。但无论我做什么,似乎每次重新发布后,有人访问该网站的前一两次,他们都会收到此错误。然后刷新一次或两次后,错误消失并且站点正常运行。

更奇怪的是,如果我查看引发错误的代码行:

URLRewriter.ProcessRewritingResult(status, excludedEnum, siteName, viewMode, relativePath);

URLRewriter是来自 3rd 方包 ( Kentico CMS - CMS.URLRewritingEngine.dll) 的类。我在那个 DLL 上运行了 Dependency Walker,发现 ICSharpCode.SharpZipLib 上没有任何依赖关系。

任何想法如何解决这一问题?

编辑:在@JeremyThompson 的建议下,我运行进程监视器来捕获错误。这是一个屏幕转储,突出显示了相关部分(出于隐私原因,一个文件夹名称被隐藏了)。您可以通过右键单击它来查看它的全尺寸等...

在此处输入图像描述

编辑:这是来自错误的负载跟踪。这有帮助吗?

=== 预绑定状态信息 ===

日志:用户 = MY-SERVER-12\Administrator

日志:DisplayName = ICSharpCode.SharpZipLib,版本=0.85.3.365,文化=中性,PublicKeyToken=1b03e6acf1164f73(完全指定)

日志:Appbase = file:///C:/inetpub/wwwroot/MySite/

日志:初始 PrivatePath = C:\inetpub\wwwroot\MySite\bin

调用程序集:CMS.WebAnalytics,Version=6.0.4377.2467,Culture=neutral,PublicKeyToken=834b12a258f213f9。

===

LOG:此绑定在默认加载上下文中开始。

日志:使用应用程序配置文件:C:\inetpub\wwwroot\MySite\web.config

LOG:使用主机配置文件:C:\Windows\Microsoft.NET\Framework64\v4.0.30319\aspnet.config

LOG:使用 C:\Windows\Microsoft.NET\Framework64\v4.0.30319\config\machine.config 中的机器配置文件。

日志:政策后参考:ICSharpCode.SharpZipLib,版本=0.85.3.365,文化=中性,PublicKeyToken=1b03e6acf1164f73

日志:正在尝试下载新的 URL 文件:///C:/Windows/Microsoft.NET/Framework64/v4.0.30319/Temporary ASP.NET Files/root/9760eb69/275bb3db/ICSharpCode.SharpZipLib.DLL。

日志:正在尝试下载新的 URL 文件:///C:/Windows/Microsoft.NET/Framework64/v4.0.30319/Temporary ASP.NET Files/root/9760eb69/275bb3db/ICSharpCode.SharpZipLib/ICSharpCode.SharpZipLib.DLL。

日志:尝试下载新的 URL 文件:///C:/inetpub/wwwroot/MySite/bin/ICSharpCode.SharpZipLib.DLL。

日志:正在尝试下载新的 URL 文件:///C:/inetpub/wwwroot/MySite/bin/ICSharpCode.SharpZipLib/ICSharpCode.SharpZipLib.DLL。

日志:正在尝试下载新的 URL 文件:///C:/Windows/Microsoft.NET/Framework64/v4.0.30319/Temporary ASP.NET Files/root/9760eb69/275bb3db/ICSharpCode.SharpZipLib.EXE。

日志:正在尝试下载新的 URL 文件:///C:/Windows/Microsoft.NET/Framework64/v4.0.30319/Temporary ASP.NET Files/root/9760eb69/275bb3db/ICSharpCode.SharpZipLib/ICSharpCode.SharpZipLib.EXE。

日志:正在尝试下载新的 URL 文件:///C:/inetpub/wwwroot/MySite/bin/ICSharpCode.SharpZipLib.EXE。

日志:正在尝试下载新的 URL 文件:///C:/inetpub/wwwroot/MySite/bin/ICSharpCode.SharpZipLib/ICSharpCode.SharpZipLib.EXE。

4

7 回答 7

5

现在我知道我确实依赖于这个 DLL,但我的系统上有 0.85.5 版本。我系统地从服务器中删除了所有版本的 DLL,重新编译所有内容并重新发布。

听起来像“依赖”是期待 DLL 的版本。为什么不用旧版本 (0.85.3.365) 替换系统上的所有版本( 0.85.5 ) 副本?(确保检查您的 Web 应用程序的“bin”文件夹和“GAC”:c:\windows\assemblies)

如果需要,可以在此处下载旧版本:http: //sourceforge.net/projects/sharpdevelop/files/SharpZipLib/0.85.3/

笔记:

  • 替换 DLL 后,停止 IIS 并清除所有 Temporary ASP.Net 文件。例如:C:\Windows\Microsoft.NET\Framework64\v4.0.30319\Temporary ASP.NET Files
  • 另外:请记住更新您的 Visual Studio 解决方案,以便它引用旧版本。

干杯

皮特

于 2012-07-22T07:43:04.090 回答
5

所以事实证明,Kentico 有它自己的依赖ICSharpCode.SharpZipZip.dll——它期待找到旧版本。我在这里找到了类似的解决方案。通过将以下块插入到我的 web.config 文件中,我似乎终于消除了这个错误!

<runtime>
  <assemblyBinding>
    <dependentAssembly>
      <assemblyIdentity name="ICSharpCode.SharpZipLib" publicKeyToken="1b03e6acf1164f73"/>
      <bindingRedirect oldVersion="0.85.3.365" newVersion="0.85.5.452"/>
    </dependentAssembly>
  </assemblyBinding>
</runtime>

我仍然不明白的是,为什么 Dependency Tracker 没有显示这种依赖关系?

编辑:哦,亲爱的,这毕竟没有解决它。现在似乎不太频繁了,但是今天重新启动 IIS 后,我们的一位测试人员又收到了旧的错误消息!:-(

于 2012-07-15T09:23:01.187 回答
4

您提到用户访问该站点的第一次或两次您收到错误。

要解决这个问题,我建议您运行Process Monitor并查看它在哪里寻找和加载程序集。

-iisreset -
在服务器上启动进程监视器-查看
几个页面并尽快重现问题-
停止 ProcessMonitor 跟踪
-在进程监视器跟踪中搜索ICSharpCode.SharpZipLib

如果失败了,看看还有什么原因:

-将 ProcessMonitor 结果保存为 CSV
- 在 Excel 中打开 CSV -
过滤所有列
- 选择拒绝访问的列的下拉列表或...

这应该告诉您错误的问题所在Could not load file or assembly

于 2012-07-15T07:37:31.403 回答
1

我认为您在绑定重定向方面走在了正确的轨道上。但是,我建议不要将您的应用程序与旧版本绑定,而是尝试将依赖程序集与较新版本绑定。

通常,强制使用旧版本是更糟糕的选择,因为虽然它可能会修复依赖程序集,但您可以将兼容性错误注入到依赖于新版本的代码中。

于 2012-07-17T14:02:56.823 回答
0

尝试附加到 AppDomain.CurrentDomain.AssemblyResolve,这样您就可以查看何时/什么程序集加载并明确设置加载位置。

于 2012-07-17T08:08:39.733 回答
0

Kentico CMS 和您的应用程序是否定义在同一个应用程序池中?尝试在自己的应用程序池中运行您的应用程序。

可能发生的情况是,当工作进程被回收时,有时您的应用程序是第一个被添加的,有时 Kentico CMS 是第一个被添加的,这会改变 ICSharpCode.SharpZipLib 的解析方式。

当您偶然刷新一次或两次时,您的应用程序首先被加载,这意味着它可以工作。

IIS 和 Asp.Net 中的应用程序池是什么?

更新:您的应用程序是网站(首次访问时编译)还是 Web 项目(在 Visual Studio 中预编译)。如果它是一个网站,那么您可以转换为一个 Web 项目并尝试一下吗?

于 2012-07-17T12:44:05.893 回答
0

您可以使用 Fuslogvw.exe 应用程序记录程序集加载并提供有关加载错误的详细信息。

在此处阅读更多信息:http: //msdn.microsoft.com/en-us/library/e74a18c4.aspx

于 2012-07-17T12:48:49.557 回答