我有一个ASP.Net的Core 2 MVC Web应用程序需要检索和服务于一个储存在同一个局域网上的其他服务器上的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;
}
但这种方式并不既不开发机也不在服务器上工作,既无法找到路径。两者之间的唯一区别是,在本地机器将运行应用程序,只有当我要求GetPdf动作返回此错误,因为它会指向C:\
DirectoryNotFoundException: Could not find a part of the path 'C:\PdfDrawings\mydrawing.pdf'.
而部署的应用程序将不能运行,因为在最开始时执行启动的配置方法会出现类似的错误。
我也试过这Startup.cs:
app.UseStaticFiles(new StaticFileOptions()
{
FileProvider = new PhysicalFileProvider(@"\\SRV1\Drawings"),
RequestPath = "/PdfDrawings"
});
我期待遇到凭证的问题,但我从来没有那么远。我也知道,有可能是安全问题这种方法,但应用程序将驻留在LAN,将只能由受信任的人员使用,所以这不是一个问题。
其他信息,如果它的问题:我在部署应用程序到Ubuntu的服务器18.04。我试图访问该文件是在同一局域网不同的服务器上。
最终,应用程序将需要阅读这第二台服务器上也写在代码的其他部分,所以会有人好心地指点一个职位/教程,说明如何实现这一目标?
你的Ubuntu服务器不理解Windows共享路径。简单地试图访问你提供你的Ubuntu服务器上的路径,你会看到这个问题。
您必须安装到您的服务器上的共享,以便能够访问它。你也必须使用不同的路径为您的本地开发和部署。
在Ubuntu上它可能是类似的/ mnt /服务器1 /图(前提是你安装在/ mnt / SRV1的份额),而在Windows上您的路径保持不变。