在 ASP.NET Core 6 Web API 中实现用于大文件传输的 OData v4 终结点

Implementation of an OData v4 Endpoint for Large File Transfer in ASP.NET Core 6 Web API

提问人:Khan75 提问时间:10/24/2023 最后编辑:Khan75 更新时间:11/1/2023 访问量:38

问:

我是在 OData 中开发 REST API 的新手,并且正在处理一个项目,该项目需要使用 Microsoft.AspNetCore.OData (v8.2.3) 包在 ASP.NET Core 6 Web API 中创建 OData v4 终结点。此终结点将负责生成并向客户端提供客户端选择的以下格式之一的文件(可能很大):CSV、JSON 或 XML。该文件将包含从数据库中提取的元组,因此我希望处理大量数据并将其传输到客户端。生成的文件将包含以所选格式序列化的对象列表。

我设计了一个可能的解决方案,该解决方案涉及创建一个 OData 函数,该函数接受所需的文件名作为参数并将文件返回给客户端。但是,我面临着一些不确定性:

端点设计:

  • 是否建议遵循 OData 函数方法来实现此功能?
  • 您将如何进行此类操作?此外,EDM 的返回类型是否正确为 Edm.Stream?

数据传输: 我确定了两种可能的数据传输策略:

a. 序列化和保存

  • 在数据库上执行查询,将数据序列化为所需的格式,将它们保存在服务器上的临时文件中,最后将文件传输到客户端。

b. 分页流式处理

  • 计算要传输的元素总数,在数据库上执行分页查询,序列化并开始逐页增量传输到客户端,直到完成。

我很乐意收到有关这些问题的反馈或建议,特别是如果有其他推荐的方法或最佳实践可供考虑此类操作。提前感谢您的帮助!

方法 a 的代码。

[HttpGet("entity({id})/Functions.GetFile(fileName={fileName})")]
public async Task<IActionResult> GetListFile(int id, string fileName)
{
    var accept = HttpContext.Request.Headers.Accept.ToString();

    // The Service creates the file in one of the formats and returns a MemoryStream.
    var memoryStream = await _service.GetStreamFileAsync(id);
    
    // Sending the file to the client
    return File(memoryStream, accept, fileName);
}
asp.net-web-api odata 数据大 文件

评论


答: 暂无答案