在我的工作场所,我们使用 Visual Studio 为大多数内部应用程序创建 ASP.NET MVC 网站。我们有一个特定的站点...顽固地处理文件连接。我们观察到,每当站点连接到文件共享服务器访问附件文档时,IIS 应用程序池就会崩溃,需要手动重新启动。
为了连接到文件共享,我们将服务帐户分配给 IIS 应用程序池用户,然后授予该用户对为该应用程序指定的文件夹的文件夹访问权限。
检查事件查看器,我们可以看到应用程序池关闭的原因是它发生了快速连续(毫秒内)的权限错误,一旦 IIS 达到快速错误配额,它就会强制应用程序池停下来。
到目前为止,这是我们检查过的事情:
我们使用的服务器运行的是 Windows Server 2016,因此运行的是 IIS 10.0。
我还应该提到,我们在这些服务器上运行了多个 Web 应用程序,它们也以与问题站点相同的方式访问附件文件,并且其结构与问题站点相同,但唯一有问题的站点是有问题的网站。所有其他站点均按预期运行。所有其他应用程序池用户服务帐户都具有与问题站点相同的权限(当然可以访问其相关文件)。
这让我很困惑,为什么我们有一个网站出现问题,而从我能想到的一切来看,它与该服务器上的其他网站具有相同的设置,而这些网站没有问题。
任何想法将不胜感激。
事实证明,应用程序使用了较旧的方法来检查附件文件的 MIME 类型。此过程使用较旧的 Windows 库,并通过计算机上的本地应用程序运行它们以分析内部文件数据。权限问题与对文件共享的访问无关,它显然可以很好地到达那里。问题在于尝试打开应用程序以确定 MIME 类型。每次应用程序提取有关附件的信息时,它都会尝试获取此 MIME 信息。
MIME 确定已更改为 C# System.Web 函数:
string mimeType = MimeMapping.GetMimeMapping(filename);
完成此更改后,应用程序不再尝试访问服务器上的系统文件,也不再生成权限拒绝错误。