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

请求内容意外结束 Kestrel ASP.NET Core

使用 JWT 令牌的 ASP.NET Core 网站到 WebApi 身份验证

从 ASP.NET Core 中的 API 读取 JWT 令牌

Asp.net Core WebAPI 基于资源的控制器级别之外的授权

免费视频使用VS Code开发ASP.NET Core WebAPI应用程序