ASP.NET Core - 从 WebApi 提供静态内容 [重复]
Posted
技术标签:
【中文标题】ASP.NET Core - 从 WebApi 提供静态内容 [重复]【英文标题】:ASP.NET Core - Serve static content from WebApi [duplicate] 【发布时间】:2021-12-03 17:39:11 【问题描述】:我的 ASP.NET Core 服务器 (.NET5.0) 上有以下文件夹结构:
wwwroot\MyXmlFiles\foo.xml这些文件可以作为https://myserver.com/MyXmlFiles/foo.xml 的静态文件访问。 但是,我想通过 WebApi 控制器操作使文件可用:
[HttpGet("uri")]
public string Get(string uri)
// How do I return the foo.xml file content here
// without redirection or loading it to memory?
【问题讨论】:
如果不通过startup.cs文件配置路径,可以直接在controller层返回一个你需要的路径视图吗? 【参考方案1】:您可以从磁盘读取文件内容并从控制器返回:
[HttpGet("uri")]
public IActionResult Get(string uri)
var path = GetPathFromUri(uri);
using (var stream = new FileStream(path, FileMode.Open, FileAccess.Read))
return new FileStreamResult(stream, "text/xml")
您必须编写 GetPathFromUri
方法将 uri 转换为物理路径(例如“MyXmlFiles/foo.xml” -> “wwwroot\MyXmlFiles\foo.xml”)
【讨论】:
通常将用户制作的参数直接转发到文件系统是一个非常糟糕的主意。 File.ReadAllText 不限于 Web 服务器根目录。至少清理文件名以仅包含列入白名单的字符(不包括 / )。 File.ReadAllText() 将文件读入内存。 OP 想避免这种情况。 @yfranz,感谢您的贡献。您的建议假定 xml 文件足够小以适合服务器的内存,但情况并非总是如此。我一直在寻找绕过内存的解决方案。 在这种情况下,您需要流式传输它。检查这个问题:***.com/questions/13983190/… @tedd-hansen 完全同意。这就是引入 GetPathFromUri 的原因。 我已将解决方案更改为使用流。以上是关于ASP.NET Core - 从 WebApi 提供静态内容 [重复]的主要内容,如果未能解决你的问题,请参考以下文章
如何在 Asp.Net Core 3.0 WebAPI 中启用 CORS
使用 JWT 令牌的 ASP.NET Core 网站到 WebApi 身份验证
从 ASP.NET Core 中的 API 读取 JWT 令牌