使用IIS7通过c#/ asp.net网页访问虚拟目录(映射驱动器)

时间:2013-11-22 09:45:11

标签: c# asp.net iis-7 virtual-directory mapped-drive

所以我有一台服务器A和服务器B.

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

网页使用框架4.0,使用VS2013 Pro RC

创建 服务器上的

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

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

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

如果文件夹位于同一台服务器A上,这当然会有效,但由于它位于不同的服务器B上,我会收到以下错误。

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


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

无法找到路径的一部分' L:\ a \ b \ file.pdf'。

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

  

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

     

来源错误:

     

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

     

堆栈追踪:

     

[DirectoryNotFoundException:找不到路径的一部分   ' L:\ a \ b \ file.pdf'。] System.IO .__ Error.WinIOError(Int32 errorCode,   String maybeFullPath)+216 System.IO.FileStream.Init(String path,   FileMode模式,FileAccess访问,Int32权限,布尔useRights,   FileShare共享,Int32 bufferSize,FileOptions选项,   SECURITY_ATTRIBUTES secAttrs,String msgPath,Boolean bFromProxy,   Boolean useLongPath)+2481 System.IO.FileStream..ctor(String path,   FileMode模式,FileAccess访问,FileShare共享,Int32 bufferSize,   FileOptions选项,String msgPath,Boolean bFromProxy)+229
  System.IO.FileStream..ctor(String path,FileMode mode,FileAccess   访问,FileShare分享)+102
  System.Web.HttpResponse.WriteFile(String filename,Boolean   readIntoMemory)+166 Reloc.Client.Contracts.openLinkClick(Object   发件人,EventArgs e)在c:\ Users \ x \ Documents \ Visual Studio中   2013 \项目\ 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(Object   来源,EventArgs args)+52
  System.Web.UI.Page.ProcessRequestMain(布尔   includeStagesBeforeAsyncPoint,Boolean includeStagesAfterAsyncPoint)   3707


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

3 个答案:

答案 0 :(得分:10)

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

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

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

您还希望授予您的服务帐户访问服务器B的份额的权限。

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

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

答案 1 :(得分:5)

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

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

答案 2 :(得分:2)

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