asp.net 如何从.NET Core API提供静态文件?

kcugc4gi  于 2023-10-21  发布在  .NET
关注(0)|答案(3)|浏览(129)

API使用.NET Core 3.1,文件夹结构如下:
溶液
--项目1
--项目2
其中Project 2依赖于Project 1,是入口点。
API托管在kubernetes上,NFS共享挂载在/storage上。API将需要检索和提供此文件共享中的文件。所以我在Project2中的startup.cs中使用了以下代码:

app.UseFileServer(new FileServerOptions()
{
    FileProvider = new PhysicalFileProvider(
    Path.Combine(Directory.GetCurrentDirectory(), @"storage")),//this will return /app/storage 
    RequestPath = new PathString("/resources")
});

我知道其中一个文件是通过检查:

System.IO.File.Exists(@"/app/storage/test.JPG");

然而,当我试图通过http://myapiurl/resources/test.JPG访问文件时,我总是得到一个404 not found
我在想我错过了什么?

jv4diomz

jv4diomz1#

您正在使用UseFileServer,但您没有启用目录浏览或提供默认文件,因此我建议您使用UseStaticFiles
启用此功能的最简单方法是将以下内容放在Configure()方法中的Startup.cs文件中。

app.UseStaticFiles(new StaticFileOptions 
{
  FileProvider = new PhysicalFileProvider(
    Path.Combine(env.ContentRootPath, "storage")),
    RequestPath = "/resources"
});

我猜这对你不起作用的原因是,当在K8中运行时,Directory.GetCurrentDirectory不会产生与你在本地运行时看到的相同的路径,所以它最终不会指向/app/storage(这就是为什么你的File.Exists检查工作正常,因为你没有动态构建路径)。
使用一些日志记录来验证它在运行时是否从配置中的正确路径拉取。

xfyts7mz

xfyts7mz2#

我在使用ingress从AppService切换到k8s后遇到了类似的静态文件问题。原来是URL中的大小写敏感问题。有些目录是“”,但在路径中,我有所有“”的字母。它可以在Windows和AppService上本地工作,但不能在k8上工作。

disbfnqx

disbfnqx3#

有两种方法来提供静态文件,即内容和Web根目录
Webroot用于提供公共和静态资源文件,如css,html,js等。
您需要在启动类中启用静态文件,并使用“IWebHostEnvironment”从wwwroot文件夹读取静态内容。
阅读全文here

相关问题