4

我有一个我开发的网络项目,其中一个主要功能是上传文件。

所有权限均基于 Windows 身份验证。当我第一次创建项目时,我没有意识到它会在负载平衡的服务器上。现在是在负载均衡服务器的环境中,文件上传已经成为一个主要问题。

我最初以为我可以只为网络共享创建一个虚拟目录作为上传文件夹,但是该解决方案已变成权限噩梦。我无法在生产环境中进行任何成功的测试运行。

所以我现在在想,我的解决方案是在服务器上创建一个服务来检查上传目录并同步它们。我看到的另一个可能的解决方案是将文件存储在我过去遇到过一些问题的数据库中。

有谁知道将文件上传到使用 Windows 权限进行身份验证的负载平衡服务器的直接解决方案?

谢谢。

更新 - 因此,我已更改应用程序池以通过对共享具有完全权限的域帐户以及 Windows 权限中的文件夹本身运行。虚拟目录在 IIS 中具有完全权限,但我仍然遇到同样的问题。

需要做的一件事是创建目录的能力,我认为这可能会让我感到困惑。我只是在使用 System.IO.Directory.CreateDirectory

关于我可能缺少权限的任何其他想法?

4

3 回答 3

6

如果您真的想避免存储在数据库中,我认为您的下一个最佳选择是您已经谈到的虚拟目录解决方案,尽管我可以看到权限问题如何根据您的设置很容易失控。

在我们的生产环境中,我们所有不同的站点都有自己的应用程序池。应用程序池本身都有自己的域帐户,这使得管理文件系统和 SQL 服务器中的权限变得更加容易。这些帐户中的每一个都是 IIS WP 域组的成员。在集群中的每台服务器上,域 IIS WP 是本地内置 IIS_WPG 组的成员。群集中每台服务器上的 IIS 配置都是相同的。这样做的重要影响是确保给定的 Web 应用程序始终以相同的身份运行,而不管集群中的哪个服务器受到攻击。

使用我描述的设置,实现虚拟目录解决方案将非常简单,尽管您仍然需要担心其他明显的问题,例如命名冲突等。如果您仍在使用默认的应用程序池身份设置,我认为实施我所描述的内容将有助于您在处理集群配置时更轻松。

本文列出了在文件系统中存储的一些优点和缺点:

好处

将文件存储在磁盘上的主要好处之一是它很容易做到。只需在 FileUpload 控件上调用 SaveAs 就可以了。

另一个优点是磁盘上的文件易于备份;您只需将文件复制到另一个位置。这也使得增量备份更容易;已备份的文件无需再次复制。

缺点

将文件存储在文件系统中也有一些缺点。可能最成问题的问题是磁盘上文件的松散耦合性质。它们与数据库中的记录没有强关系。因此,当您从数据库中删除产品时,您最终可能会得到一个孤立的产品图像。没有直接的方法可以在产品表和您的图像文件夹之间进行 INNER JOIN 以确定您留下了哪些孤立文件。这意味着页面开发人员负责编写代码,以便在关联的数据库记录被删除时从磁盘中删除文件。

此外,要将上传的文件存储在磁盘上,您的 Web 服务器需要写入文件系统的权限。当您运行自己的服务器时,这很容易实现,但在 ISP 场景中可能会出现更多问题。

于 2008-12-29T18:54:19.307 回答
0

您的解决方案应该可以正常工作:

  1. 创建网络帐户
  2. 让每台服务器上的应用程序的应用程序池在此帐户下运行
  3. 在特定服务器上创建一个文件夹并授予此网络帐户权限
  4. 将文件夹设置为“共享”,并授予该共享的帐户权限
  5. 设置所有服务器使用该目录存储上传的文件
于 2008-12-29T19:06:33.900 回答
0

供参考,

此问题的解决方案是使用有权访问共享、文件夹权限和虚拟目录权限的用户帐户进行临时模拟。

当我最初尝试这个时,我的模拟代码中有一些错误,然后在修复时输入了错误的密码,所以我放弃了这种方法。我终于尝试了其他所有方法并回到了这个 - 看起来它正在工作。

因此,在将网络共享处理为看起来像的虚拟目录时,答案就是模拟。

这是实现这一切的代码的链接:

http://support.microsoft.com/kb/306158#4

于 2008-12-30T21:07:19.443 回答