【问题标题】:IIS 7.5 .NET Shared DLL Access is Denied ErrorIIS 7.5 .NET 共享 DLL 访问被拒绝错误
【发布时间】:2023-10-16 17:53:01
【问题描述】:

前言:我们有负载平衡的 Web 服务器,以及一个安静的 wcf api Web 应用程序。 在我们的 Web 应用程序中,我们通过 nuget 包或其他 Visual Studio 项目添加了几个引用。上周我添加了一个新项目(PLEGateway),它是我们系统中的一个数据层,以及一些对第 3 方系统的 API 调用。 代码 (bin) 发布到文件服务器,并具有适当的权限,因此 Web 服务器可以看到它。

部署后,我遇到了可怕的 无法加载文件或程序集“PLEGatewayCore,Version=1.0.0.6,Culture=neutral,PublicKeyToken=null”或其依赖项之一。访问被拒绝。错误。

奇怪的是,它似乎只是间歇性地抛出这个错误。这意味着它会起作用,过一会儿回来再试一次,它会失败。稍等片刻,回来,它会突然工作。 “awhile”的定义从 5 分钟到一夜之间,所以只是尝试通过邮递员随机执行它。

我浏览了谷歌和其他关于这个问题的 SO 问题,它们似乎都指向临时 asp.net 文件夹的权限问题。我验证权限设置正确。为 32 位应用程序启用了应用程序池IS。 Web 应用程序中的所有其他方法都有效,只有那些引用此 dll 中的任何函数的方法才会导致错误。

我终于开始查看此应用程序池的 W3wp.exe 文件的进程资源管理器,当我查看 .NET 程序集选项卡时,一台服务器已加载我的 dll,而另一台服务器在查看非共享时没有应用域部分。

总的来说,我的问题是:为什么一台服务器加载 dll,而另一台服务器不加载,而他们的 IIS 配置也从同一位置(共享配置)提取?

【问题讨论】:

  • 我是否正确理解两个网络服务器都指向另一个服务器,即具有 de bin 文件夹和其他网站文件的文件服务器?
  • 是的,两个 Web 服务器都指向另一个服务器,即文件服务器。

标签: .net dll iis-7.5 access-denied


【解决方案1】:

您有 2 个网络服务器 A 和 B。两者都配置为从共享文件服务器将其二进制文件加载到 bin 文件夹中。

您收到拒绝访问错误,因为 IIS 在加载时锁定这些文件。这意味着只有一个网络服务器成功加载了它的二进制文件。

错误间歇性发生的原因取决于您的 webrequest 由哪个服务器提供服务,这由负载均衡器及其使用的负载均衡算法决定。

将二进制文件放在每个单独的网络服务器上,以防止这些文件出现单点故障。

【讨论】:

  • 好吧,我只是感到困惑,因为我们在这个项目中有其他 dll,我们以前从未经历过这种情况。你能以某种方式在 web.config 文件中引用 dll 的位置吗?
  • 不,这是不可能的;按照惯例,它们必须位于 bin 文件夹(或 GAC)中。但是为了提高容错性,请确保每个 Web 服务器对其他服务器的依赖尽可能少。我们有 3 个独立的网络服务器,只有共同的数据库服务器,甚至没有共享配置。