IIS在尝试加载dll时报告System.Runtime.Serialization.SerializationException

我最近几天一直在和IIS打架,IIS产生的错误是:

exception:System.Runtime.Serialization.SerializationException

消息:无法find程序集'FluentNHibernate,版本= 1.0.0.633,文化=中立,PublicKeyToken = 8aa435e3cb308880'。

奇怪的是,如果我检查procmon,我可以看到IIS进程在我期望它find它的目录中finddll,然后继续search其他目录中完全相同的dll。 它也在寻找DLL的某些原因的PDB。 该DLL也存在于IIS创build的临时目录中:

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文件,编译debugging在所有情况下设置为false,所以我很惊讶地看到它寻找pdbs。

谷歌search这个错误没有返回任何有用的东西。

我正在使用IIS 7的Win2k8 x86,我的应用程序池是ASP.NET v4.0集成的。

这是一个典型的.NET故障排除问题。

几件事情:

  1. 您看到的SerializationException是一个更高级别的错误。 这不是根本原因。
  2. 无法find组件的消息意味着几件事情:
    1. 您在应用程序的bin目录中没有所需的文件。
    2. bin目录中的文件不是正确的版本。 (最有可能的)
  3. 临时文件path与它无关,这只是一个临时的地方,文件可能已经被复制过。
  4. 查找PDB或debugging数据库可以帮助提取符号和其他debugging信息,从而为您提供更详细的错误,无论哪种方式都不是必需的,也很less使用编译的生产DLL进行部署。

我肯定会确保Fluent NHibernate DLL的版本与软件预期运行的版本相匹配。 您可能需要联系开发人员/供应商,以澄清问题。 这很可能不是一个IIS问题,而是一个应用程序问题。

我终于弄明白了,这与IIS无关。 张贴我的答案,以防其他人在未来出现类似的问题。

最后导致我的问题是,我无法连接到我的一个数据库,这导致了一个exception被抛出。 不知何故(还不知道如何),这是被一件事情抓住,然后被IIS试图序列化一个错误消息,但它找不到一个DLL,因为它最终捕捉到它在另一个AppDomain中。 我最终发现这个问题,将windbg附加到w3wp进程并观察它启动。

所以,如果你得到这个错误,请尝试将windbg附加到你的进程,看看是什么错误被抛出。