在内网应用程序中读取远程驱动器中的文件
Read Files from Remote Drive in Intranet App
我想从网络共享文件夹中读取与某些参数匹配的 pdf 文件名,并提供 link 以便在我的模型的详细信息页面上查看它们。我需要得到的只是文件名。我现在不需要任何文件 management/read/write。
如果我有路径,我可以在浏览器中显示 .pdf(IE 将打开 "file://" links)。我缺少的部分是在 运行 时间从远程(但相同的域)目录获取文件名。
我们已经为应用程序设置了一个虚拟目录,如果解析的物理文件夹在同一台服务器上,它在过去工作正常,但这里不是这种情况。
我尝试过模拟,但这似乎不起作用,因为我仍然遇到访问被拒绝的错误。
我知道这可能是一个安全问题,这就是不允许这样做的原因,但是是否需要设置 IIS 配置或其他途径来允许这样做?我似乎无法找到一种方法,只使用打开目录进行阅读的代码。
我通常如何从虚拟目录中的一个文件中读取一些信息的示例代码:
// This example code is inside a controller action, so Server refers to HttpContextBase
var path = Server.MapPath("~/MyVirtualDirectory/" + fileName);
var fileExists = System.IO.File.Exists(path);
var fileLastModified = System.IO.File.LastWriteTime(path);
为了枚举目录中的匹配文件,我使用了 DirectoryInfo
var pdfFileNames = new List<string>();
var dir = new DirectoryInfo(Server.MapPath("~/VirtualDirectory/"));
var pdfs = dir.EnumerateFiles("*.pdf");
foreach (var pdf in pdfs)
{
pdfFileNames.Add(pdf.Name);
}
正如我所提到的,当物理文件夹位于同一台服务器上时,这些方法可以正常工作,但是一旦目录位于远程驱动器上,它就不再有效了。我有权打开所需的目录,我的同事说他给了虚拟目录和服务器适当的权限。不确定此时还可以尝试什么。
编辑:现在它正在运行,我使用虚拟目录显示文件
http://server/appName/virtualDirectory/pdfFileName
默认情况下,IIS 应用程序池 运行 在名为 IIS APPPOOL\[NameOfYourAppPool] 的特定本地 Windows 身份下。这是本地用户,无法授予此身份访问位于不同计算机上的资源的权限。
如果两台服务器都在同一个域内,您可以尝试以下解决方案:
- 运行域用户下的IIS应用程序,并授予该域用户所需的权限。
- 运行NetworkService身份下的IIS应用程序并授权给IIS服务器的DOMAIN\MACHINENAME$账号。
我想从网络共享文件夹中读取与某些参数匹配的 pdf 文件名,并提供 link 以便在我的模型的详细信息页面上查看它们。我需要得到的只是文件名。我现在不需要任何文件 management/read/write。
如果我有路径,我可以在浏览器中显示 .pdf(IE 将打开 "file://" links)。我缺少的部分是在 运行 时间从远程(但相同的域)目录获取文件名。
我们已经为应用程序设置了一个虚拟目录,如果解析的物理文件夹在同一台服务器上,它在过去工作正常,但这里不是这种情况。
我尝试过模拟,但这似乎不起作用,因为我仍然遇到访问被拒绝的错误。
我知道这可能是一个安全问题,这就是不允许这样做的原因,但是是否需要设置 IIS 配置或其他途径来允许这样做?我似乎无法找到一种方法,只使用打开目录进行阅读的代码。
我通常如何从虚拟目录中的一个文件中读取一些信息的示例代码:
// This example code is inside a controller action, so Server refers to HttpContextBase
var path = Server.MapPath("~/MyVirtualDirectory/" + fileName);
var fileExists = System.IO.File.Exists(path);
var fileLastModified = System.IO.File.LastWriteTime(path);
为了枚举目录中的匹配文件,我使用了 DirectoryInfo
var pdfFileNames = new List<string>();
var dir = new DirectoryInfo(Server.MapPath("~/VirtualDirectory/"));
var pdfs = dir.EnumerateFiles("*.pdf");
foreach (var pdf in pdfs)
{
pdfFileNames.Add(pdf.Name);
}
正如我所提到的,当物理文件夹位于同一台服务器上时,这些方法可以正常工作,但是一旦目录位于远程驱动器上,它就不再有效了。我有权打开所需的目录,我的同事说他给了虚拟目录和服务器适当的权限。不确定此时还可以尝试什么。
编辑:现在它正在运行,我使用虚拟目录显示文件
http://server/appName/virtualDirectory/pdfFileName
默认情况下,IIS 应用程序池 运行 在名为 IIS APPPOOL\[NameOfYourAppPool] 的特定本地 Windows 身份下。这是本地用户,无法授予此身份访问位于不同计算机上的资源的权限。
如果两台服务器都在同一个域内,您可以尝试以下解决方案:
- 运行域用户下的IIS应用程序,并授予该域用户所需的权限。
- 运行NetworkService身份下的IIS应用程序并授权给IIS服务器的DOMAIN\MACHINENAME$账号。