ASP.NET Core - 从 WebApi 服务静态内容

26 浏览
0 Comments

ASP.NET Core - 从 WebApi 服务静态内容

我在我的ASP.NET Core服务器(.NET5.0)上有以下文件夹结构:

  • wwwroot\MyXmlFiles\foo.xml

可以将这些文件作为静态文件访问,如https://myserver.com/MyXmlFiles/foo.xml

然而,我想通过WebApi控制器操作使文件可用:

[HttpGet("{uri}")]
public string Get(string uri)
{
     // 在这里如何返回foo.xml文件的内容
     // 而不进行重定向或加载到内存中?
}

0
0 Comments

ASP.NET Core - 从WebApi中提供静态内容

在ASP.NET Core的WebApi中,我们经常需要从磁盘上读取文件的内容并返回给客户端。下面是一个简单的示例代码:

[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");
    }
}
private string GetPathFromUri(string uri)
{
    // 将uri转换为物理路径
    // 例如 "MyXmlFiles/foo.xml" -> "wwwroot\MyXmlFiles\foo.xml"
    // 在转换过程中,需要对uri进行过滤,确保只包含合法的字符
    // 避免直接将用户输入的参数传递到文件系统中,这可能导致安全问题
}

在上述代码中,我们通过`GetPathFromUri`方法将用户传入的uri转换为物理路径。在转换过程中,需要对uri进行过滤,确保只包含合法的字符,避免直接将用户输入的参数传递到文件系统中。

然后,我们使用`FileStream`来打开文件,并将其作为流返回给客户端。这样做的好处是可以避免将整个文件读入内存,尤其是当文件很大时。

然而,上述代码仍然有潜在的问题。如果我们假设文件很小,可以完全放入服务器内存中,那么直接使用`File.ReadAllText`可能更简单。但是,这样做可能会导致服务器内存消耗过大,因此不适合所有情况。

如果文件较大,我们可以使用流来读取文件内容。这样可以避免将整个文件读入内存。下面是一个相关的问题的链接:stackoverflow.com/questions/13983190/...

最后,根据之前的建议,我们将代码修改为使用流来返回文件内容,以避免内存消耗过大的问题。

0