2008-12-29 58 views
4

我有一个web项目,我开发的地方是上传文件的主要功能之一。负载均衡服务器上的文件上传

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

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

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

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

谢谢。

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

需要做的事情之一就是创建目录的能力,我认为这可能会让我绊倒现在。我只是使用System.IO.Directory.CreateDirectory

任何其他想法,我可能会失去权限?

+0

如果说有“充分的权限”,我真的不知道这可能是错误的 - 只是确保它确实在目录上具有“修改”和“写入”权限。如果您使用组分配NTFS权限,请尝试直接使用该帐户。 – 2008-12-30 00:58:38

+0

此外,如果您更改工作进程帐户的组成员身份,则必须重新启动IIS(而不仅仅是网站或应用程序池)才能重新进行身份验证,就像用户必须注销并登录一样。 – 2008-12-30 01:00:08

回答

0

仅供参考,

这个问题的解决办法是做暂时的模拟与曾访问共享的用户帐户,权限的文件夹上和虚拟目录的权限。

当我最初尝试这样做时,我的模拟代码中出现了一些错误,然后在输入错误的密码后,我放弃了这种方法。我终于尝试了其他一切,然后回到了这里 - 看起来像是在工作。

所以,当把网络共享作为虚拟目录进行处理时,答案就是模拟。

这里的链接,使这一切发生的代码:

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

6

如果你真的想避免存储在数据库中,我认为你的下一个最好的选择是你已经谈到的虚拟目录解决方案,但我可以看到权限问题很容易失控,具体取决于你的建立。

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

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

This article lists some good advantages and disadvantages to storing in the file system:

优势

一个存储上 磁盘上的文件的 主要好处是,它是很容易做到的。 只需在FileUpload 控件上调用SaveAs即可完成。

另一个优点是, 磁盘上的文件很容易备份;您只需将 这些文件复制到其他位置即可。这个 也使得它更容易做增量备份 ;已经备份的文件 不需要再次被复制 。

缺点

在文件系统中存储 您的文件有几个 缺点。可能 最有问题的问题是 磁盘上的文件的松散耦合性质 。他们没有强大的关系 与数据库中的记录。因此,当您从数据库中删除产品 时,您最终可能会收到 孤儿产品图像。有没有 直接的方式来做一个INNER JOIN之间 产品表和您的图像 文件夹来确定什么孤立的 文件,你已经离开。这意味着 页面开发人员负责 编写的代码,只要关联的 数据库记录被删除,就会从磁盘上删除文件 。

此外,要将上传的文件存储在磁盘上,您的网络服务器需要将权限写入到文件系统中,并将其写入 。当您运行自己的 服务器时,很容易发现 ,但在ISP方案中可能证明存在更多 问题。

0

你的解决方案应该很好地工作:

  1. 创建一个网络帐户
  2. 在这个帐户
  3. 下,每台服务器上运行的应用程序的应用程序池的特定服务器上创建一个文件夹,给这个网络帐户权利
  4. 将该文件夹设置为“分享”并给予该分享的帐户权利
  5. 将所有服务器使用此目录存储上传的文件
相关问题