12

所以我有一个服务器A和服务器B。

服务器 A:Windows Server 2008R2 服务器 B:Windows Server 2003

网页使用的是framework 4.0,用VS2013 Pro RC创建

在服务器 A 上,我的 asp.net/c# 网页正在服务器 B 上的 IIS7 上运行,我有一个共享文件夹。

现在我已将此共享文件夹从服务器 B 映射到服务器 A,并且可以通过 Desktop\Windows Explorer 完全访问它,但是从网页访问该文件夹是另一回事。

要访问该文件夹,我在 IIS7 中所做的是,在同一网页下创建一个虚拟文件夹,并将其指向映射的驱动器。

如果该文件夹位于同一服务器 A 上,这当然会起作用,但由于它位于不同的服务器 B 上,因此出现以下错误。

找不到路径“L:\a\b\file.pdf”的一部分,现在路径 100% 正确,因为我已经检查过了。


下面是一些额外的调试信息:

找不到路径“L:\a\b\file.pdf”的一部分。

说明:执行当前 Web 请求期间发生未处理的异常。请查看堆栈跟踪以获取有关错误及其源自代码的位置的更多信息。

异常详细信息:System.IO.DirectoryNotFoundException:找不到路径“L:\a\b\file.pdf”的一部分。

源错误:

在执行当前 Web 请求期间生成了未处理的异常。可以使用下面的异常堆栈跟踪来识别有关异常起源和位置的信息。

堆栈跟踪:

[DirectoryNotFoundException:找不到路径“L:\a\b\file.pdf”的一部分。] System.IO.__Error.WinIOError(Int32 errorCode, String maybeFullPath) +216 System.IO.FileStream.Init(String路径、FileMode 模式、FileAccess 访问、Int32 权限、Boolean useRights、FileShare 共享、Int32 bufferSize、FileOptions 选项、SECURITY_ATTRIBUTES secAttrs、String msgPath、Boolean bFromProxy、Boolean useLongPath) +2481 System.IO.FileStream..ctor(String path, FileMode mode, FileAccess access, FileShare share, Int32 bufferSize, FileOptions options, String msgPath, Boolean bFromProxy) +229
System.IO.FileStream..ctor(String path, FileMode mode, FileAccess access, FileShare share) +102
System.Web.HttpResponse.WriteFile(String filename, Boolean readIntoMemory) +166 Reloc.Client.Contracts.openLinkClick(Object sender, EventArgs e) in c:\Users\x\Documents\Visual Studio 2013\Projects\p\p\ S\Listdoc.aspx.cs:230
System.Web.UI.WebControls.GridView.HandleEvent(EventArgs e, Boolean CauseValidation, String validationGroup) +1192
System.Web.UI.WebControls.GridViewRow.OnBubbleEvent(Object source, EventArgs e) +164 System.Web.UI.Control.RaiseBubbleEvent(对象源,EventArgs 参数)+52
System.Web.UI.Page.ProcessRequestMain(布尔 includeStagesBeforeAsyncPoint,布尔 includeStagesAfterAsyncPoint)+3707


我相信这可能与许可或相关,尝试了很多事情,没有运气。所以请在这里帮助我。提前致谢。

4

3 回答 3

11

正如 wata 所建议的,每个用户都有自己的映射驱动器。这意味着您的 L: 驱动器与您的应用程序池帐户的 L: 驱动器不同。

此外,除非您更改了运行应用程序池的帐户,否则它将无法访问其他服务器上的共享文件夹。您很可能使用 Active Directory 域帐户登录到两台服务器。如果是这样,您可能需要创建一个新的 Active Directory 域帐户以用作您的应用程序池的身份。您可以更改应用程序池标识以将您自己的域帐户用于开发/测试目的,但这不是生产系统中推荐的安全做法。

一旦您创建了新的 Active Directory“服务帐户”(为避免将来的麻烦,请确保密码不会过期),您需要在 IIS 中更改应用程序池的身份。转到应用程序池,找到您的站点正在使用的应用程序池,选择它并选择右侧的高级设置,转到身份,然后单击 ... 按钮设置自定义帐户,确保在用户名前加上域名:mydomain\myserviceusername。

您还需要授予服务帐户对服务器 B 共享的访问权限。

现在,您需要使用您的服务帐户创建从服务器 A 到服务器 B 的持久映射驱动器。有关详细信息,请参阅内容,确保设置一个脚本,在重新启动后使用命令重新映射驱动器net use L: \\ServerB\sharedfolder /persistent:yes,确保它作为您的服务帐户运行。您甚至可以在应用程序的 Global.asax.cs Application_Start 中运行这第一件事。如果您想避免本段中步骤的麻烦,请使用 wata 的建议,即使用完整的 UNC 路径而不是使用映射驱动器。

现在您的 Web 应用程序应该能够访问服务器 B 上的共享文件夹。:-)

于 2013-11-27T02:14:12.373 回答
5

问题是,如果您创建一个映射驱动器,它只对创建它的用户可见。由于您的应用程序的 IIS 应用程序池可能在不同的用户下运行,因此该映射驱动器对其不可见。(在不同的用户帐户下运行应用程序是一种很好的安全做法)

我建议如下:不要为虚拟目录使用映射驱动器,而是尝试使用 UNC 路径。例如:创建一个名为“documents”的虚拟目录,它映射到 \\ServerB\a\b。然后您应该能够使用“documents/file.pdf”访问您的文件。请记住,应用程序的 IIS 应用程序池用户需要有权访问网络共享 \\ServerB\ 以及您需要的子文件夹和文件。

于 2013-11-25T18:24:23.093 回答
2

检查服务器上文件夹的权限,并确保站点的应用程序池可以访问它。

于 2013-11-22T09:50:55.963 回答