首页 > 解决方案 > 如何让 Web 应用程序从不同的服务器提供静态文件

问题描述

我有一个 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 中提供静态文件,所以这并不让我感到惊讶。因此,基于这篇文章和其他类似的文章,我将这段代码添加到 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;
}

但是这种方式在开发机器和服务器上都不起作用,因为两者都找不到路径。两者的唯一区别是本地机器会运行应用程序,并且只有在我请求 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 中的不同服务器上。

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

标签: c#asp.net-coreasp.net-core-2.0static-files

解决方案


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

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

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


推荐阅读