1

大型 asp.net 4 应用程序有一个非常奇怪的问题。IIS 有时不会从卷影副本位置加载模块,而是从 dll 最初来源的 bin 目录加载模块。

有谁知道 IIS 模块加载的工作原理以及这是正常行为还是错误?

这给我们带来的问题

  • 在开发中;相应的 dll 被锁定在 bin 文件夹中,这意味着 msbuild 无法在构建时替换它。
  • 这给我们带来了一个特别讨厌(而且很难找到)的问题(我们正在使用 hack 解决这个问题),我们在 nhibernate 查询中得到 TypeMismatchException

笔记

  • 在 Win7 和 WinServer2008R2、IIS 7.5 上运行的 ASP.NET 4 应用程序,使用 MVC3、MVC4、WebForms、WebApi 的多个项目
  • 通过附加 VS 调试器和检查加载的模块获取的模块信息
  • 如果我 IISRESET 并清除 temp asp.net 文件夹,然后启动应用程序,则 dll 将全部复制到卷影副本位置,然后从那里加载。如果我然后再次 IISRESET 并启动应用程序,则模块将从 bin 位置而不是卷影副本位置加载
  • 这只会影响 Web 项目的项目依赖项,入口点始终从卷影副本位置加载。IE Proj.Web将从卷影副本位置加载,该Proj.BusinessLogicProj.DataAccess的项目依赖项将从 bin 文件夹加载,外部依赖项(automapper、glimpse 等)将从卷影副本位置加载。
  • 我们不会在代码、web.config 或 IIS 配置(默认设置)中覆盖任何应用程序池或应用程序域配置。
  • 找不到详细记录模块加载或应用程序启动的任何地方。
4

1 回答 1

1

几周前发现了这个问题的根本原因,现在发布希望能帮助任何遭受类似问题困扰的人。

在与我们的一些开发人员交流了几次后,我们发现这是我们扫描 dll 以查找休眠配置的方式自己造成的。

当我们从代码中显式加载 dll 时,我们滥用了Assembly辅助方法。Assembly.LoadFrom(assemblyPath)我们使用的是Assembly.LoadFile(assemblyPath). 这些方法之间有很多区别,这里相关的是LoadFile()加载指定的文件,而LoadFrom()将应用逻辑从其他位置(如临时、缓存或 GAC)查找程序集。有关差异的更多详细信息,请参阅此问题

无论如何,在更改了这一行代码之后,我们所有的问题都消失了。

于 2015-01-19T07:03:33.453 回答