如何让 Web 应用程序提供来自不同服务器的静态文件

How to get a web app to serve static files from a different server

我有一个 ASP.Net Core 2 MVC webapp,它需要检索和提供存储在同一 LAN 上不同服务器上的 pdf。它知道完整的路径名。这段代码在本地机器上开发时运行良好(我将代码精简到最低限度以达到目的):

public IActionResult GetPdf()
{
    FileStream fileStream = new FileStream(@"\SRV1\Drawings\mydrawing.pdf", FileMode.Open, FileAccess.Read);
    var fsResult = new FileStreamResult(fileStream, "application/pdf");
    return fsResult;
}

但是,当我在测试部署的服务器上发布应用程序时,出现此错误:

System.IO.FileNotFoundException: Could not find file '/var/www/myapp/\SRV1\Drawings\mydrawing.pdf'

现在,我知道该应用程序只能从其 wwwroot 中提供静态文件,所以我并不感到惊讶。因此,基于 this post 和其他类似的帖子,我将此代码添加到 Startup.cs:

app.UseFileServer(new FileServerOptions
{
    FileProvider = new PhysicalFileProvider(@"\SRV1\Drawings"),
    RequestPath = new PathString("/PdfDrawings"),
    EnableDirectoryBrowsing = false
});

并像这样更改了控制器的操作:

public IActionResult GetPdf()
{
    FileStream fileStream = new FileStream(@"\PdfDrawings\mydrawing.pdf", FileMode.Open, FileAccess.Read);
    var fsResult = new FileStreamResult(fileStream, "application/pdf");
    return fsResult;
}

但是这种方式无论是在开发机上还是在服务器上都行不通,因为都找不到路径。两者唯一的区别是本地机器会 运行 应用程序,而 return 只有在我请求 GetPdf 操作时才会出现此错误,因为它会指向 C:\

DirectoryNotFoundException: Could not find a part of the path 'C:\PdfDrawings\mydrawing.pdf'.

而部署的应用程序甚至不会 运行 因为在执行 Startup 的 Configure 方法时一开始就发生了类似的错误。

我也在 Startup.cs 中尝试过这个:

app.UseStaticFiles(new StaticFileOptions()
{
    FileProvider = new PhysicalFileProvider(@"\SRV1\Drawings"),
    RequestPath = "/PdfDrawings"
});

我原以为会遇到凭据问题,但我从来没有走到那一步。我也知道这种方法可能存在安全问题,但该应用程序将驻留在 LAN 中,并且只会由受信任的人员使用,因此这不是问题。

其他信息,以防万一:我正在将应用程序部署到 Ubuntu 服务器 18.04。我尝试访问的文件位于同一 LAN 中的不同服务器上。

最终,该应用程序还需要在第二台服务器上读取和写入代码的其他部分,所以有人会好心地向我指出 post/tutorial 来解释如何实现这一点吗?

您的 Ubuntu 服务器不理解 Windows 共享路径。只需尝试访问您在 Ubuntu 服务器上提供的路径,您就会发现问题所在。

您必须将共享安装到您的服务器上才能访问它。您还必须为本地开发和部署使用不同的路径。

在 Ubuntu 上,它可能类似于 /mnt/srv1/Drawings(前提是您在 /mnt/srv1 中安装了共享),而在 windows 上,您的路径保持不变。