![IIS 在尝试加载 dll 时报告 System.Runtime.Serialization.SerializationException](https://linux22.com/image/592104/IIS%20%E5%9C%A8%E5%B0%9D%E8%AF%95%E5%8A%A0%E8%BD%BD%20dll%20%E6%97%B6%E6%8A%A5%E5%91%8A%20System.Runtime.Serialization.SerializationException.png)
过去几天我一直在与 IIS 斗争,IIS 生成的错误是:
异常:System.Runtime.Serialization.SerializationException
消息:无法找到程序集“FluentNHibernate,Version=1.0.0.633,Culture=neutral,PublicKeyToken=8aa435e3cb308880”。
奇怪的是,如果我检查 procmon,我可以看到 IIS 进程在期望找到它的目录中找到 dll,然后它继续在其他目录中搜索完全相同的 dll。出于某种原因,它还在 PDB 中搜索 DLL。该 DLL 也存在于 IIS 创建的临时目录中:
C:\Windows\Microsoft.NET\Framework\v4.0.30319\Temporary ASP.NET Files\ws-sm\bc2df7a7\729516d\assembly\dl3\42ab9d3b\00d491a3_3e6bcd01\FluentNHibernate.DLL
因此它显然能够将 dll 复制到其运行位置,但它报告找不到它。
我检查了所有的 web.config 文件,发现编译调试在所有情况下都设置为 false,因此我很惊讶看到它正在寻找 pdbs。
谷歌搜索此错误没有返回任何有用的信息。
我正在使用带有 IIS 7 的 Win2k8 x86,并且我的应用程序池是 ASP.NET v4.0 集成的。
答案1
这是一个典型的 .NET 故障排除问题。
有几件事:
- 您看到的 SerializationException 是更高级别的错误。 它不是根本原因。
- 无法找到程序集的消息意味着几件事:
- 您在应用程序的 bin 目录中没有所需的文件。
- bin 目录中的文件不是正确的版本。(最有可能的)
- 临时文件路径与它无关,这只是一个临时位置,文件可能已经从之前复制过来了。
- 寻找 PDB 或调试数据库来帮助提取符号和其他调试信息,以便为您提供更详细的错误,无论哪种方式,它都不是必需的,并且很少与编译的生产 DLL 一起部署。
我肯定会确保 Fluent NHibernate DLL 的版本与软件预期运行的版本相匹配。不过,您可能需要联系开发人员/供应商来澄清问题。这很可能不是 IIS 问题,而是应用程序问题。
答案2
我终于搞明白了,这与 IIS 无关。发布我的答案以防将来其他人遇到类似的问题。
最终导致我遇到的问题是,我无法连接到我的一个数据库,这导致抛出异常。不知何故(仍然不确定如何)它被一个东西捕获,然后被 IIS 捕获,它试图序列化错误消息,但它找不到所需的 DLL,因为它最终捕获它的位置在另一个 AppDomain 中。我最终通过将 windbg 附加到 w3wp 进程并观察其启动来发现这个问题。
因此,如果您收到此错误,请尝试将 windbg 附加到您的进程并查看引发了哪些错误。