从 IIS 访问网络上的文件

Accessing Files on Network from IIS

我有一个共享路径 \mynetworkshare\myfolder,其中存储了图像。

我有一个域用户 mydomainuser 被授予读取该路径中文件的权限

我在 IIS 上托管网站。我在我的 IIS 站点中创建了一个虚拟目录,其中别名 myphotos 指向物理路径 \mynetworkshare\myfolder。我还单击了 Add Virtual Directory 对话框中的 Connect as... 按钮并提供了我的 mydomainuser 凭据。

我点击了新创建的虚拟导演 myphotos,然后点击右窗格中的内容视图。我可以在 IIS 中查看我的所有照片。由此,我假设我的共享驱动器的虚拟目录设置是正确的。

现在,问题是如何从我的代码访问此虚拟目录或其中的文件?

下面我试过了

var filePath = Server.MapPath("~/myphotos/" + "myimage.jpg");

当我将文件路径写入日志文件时,我看到它正在尝试映射到我的网站文件夹中的物理文件夹设置。

而不是指向

\mynetworkshare\myfolder\myimage.jpg

它指向

d:\wwwroot\inetpub\mywebsitefolder\myphotos\myimage.jpg

我知道 Server.MapPath 解析为托管站点的物理路径,但我想知道它是否与我的虚拟目录行为相同。

或者我是否需要让 ASP.Net 以某种方式知道 myphotos 是在 IIS 上创建的虚拟目录?或者我在错误的路径上获取文件?我需要编写不同的代码吗?

您可以使用 System.Web.Administration(在 NuGet 中可用)从 IIS (7+) 获取物理路径

var physicalPath = new Microsoft.Web.Administration.ServerManager()
    .Sites["Default Web Site"]
    .Applications["/MyApplication"]
    .VirtualDirectories["/MyVirtualPath"]
    .PhysicalPath;

如果虚拟目录在根目录下,应用程序是"/"

Connect as... 中指定的内容可能仅适用于直接网络请求。要从您的应用程序访问文件,您需要将应用程序池配置为使用 mydomainuser 作为其标识(在 Advanced Settings... 下找到),或者您需要向计算机 [=22] 授予共享权限=] IIS 如果应用程序池使用内置帐户。

缺少的步骤是将虚拟文件夹转换为应用程序。

Right-click the Virtual Folder myphotos, click on Convert to Application

link here应该解释一下步骤

不加Server.MapPath,效果很好。例如

image.src = "~/myphotos/myimage.jpg"