c# - 如何让 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 中的不同服务器上。
最终,该应用程序将需要在第二台服务器上读取和写入代码的其他部分,所以有人会好心地将我指向一个解释如何实现这一点的帖子/教程吗?
解决方案
您的 Ubuntu 服务器不理解 Windows 共享路径。只需尝试访问您在 Ubuntu 服务器上提供的路径,您就会看到问题。
您必须在服务器上安装共享才能访问它。您还必须为本地开发和部署使用不同的路径。
在 Ubuntu 上,它可能类似于 /mnt/srv1/Drawings(前提是您将共享安装在 /mnt/srv1 中),而在 Windows 上,您的路径保持不变。
推荐阅读
- php - 如何更改 laravel 队列中作业表的表名和列名?
- javascript - React JS 15.0 - 减速器根本不工作
- android - Android App Kotlin:未解决的参考:地图
- selenium - 错误:找不到配置文件目录。console.warn:SearchSettings:“获取:不存在设置文件,新配置文件?” 使用 GeckoDriver Firefox 和 Selenium
- javascript - 同步回调时的回调队列
- amazon-web-services - 如何使 S3 存储桶出现在另一个 Aws 帐户的云端源列表中
- python - 避免代码 TypeError:“NoneType”对象不可下标
- python - 带有类变量的 Python 数据类继承
- three.js - ScreenToWorldPoint 实现 ThreeJS
- scala - 如何将 Akka 示例集群 kubernetes 与 Scala 和 minikube 一起使用?