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

Man*_*ana 11 c# asp.net iis-7 mapped-drive virtual-directory

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

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

网页使用的是使用VS2013 Pro RC创建的框架4.0

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

现在我已经将此共享文件夹从服务器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'的一部分.

来源错误:

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

堆栈跟踪:

[DirectoryNotFoundException:找不到路径的一部分'L:\ a\b\file.pdf'.] System.IO .__ Error.WinIOError(Int32 errorCode,String maybeFullPath)+216 System.IO.FileStream.Init(String path,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模式,FileAccess访问,FileShare共享,Int32 bufferSize,FileOptions选项,字符串msgPath,布尔bFromProxy)+229
System.IO.FileStream..ctor(字符串路径,FileMode模式,FileAccess访问,FileShare共享)+102
System.Web.HttpResponse .WriteFile(String filename,Boolean readIntoMemory)+166 Reloc.Client.Contracts.openLinkClick(Object sender,EventArgs e)位于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 valida ingGroup)+1192
System.Web.UI.WebControls.GridViewRow.OnBubbleEvent(Object source,EventArgs e)+164 System.Web.UI.Control.RaiseBubbleEvent(Object source,EventArgs args)+52
System.Web.UI.Page. ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint,Boolean includeStagesAfterAsyncPoint)+3707


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

Ora*_*son 10

正如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上的共享文件夹.:-)


小智 5

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

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