【问题标题】:ASP.NET Core: Is it possible to use HttpClient to fetch a file and return directly?ASP.NET Core:是否可以使用 HttpClient 获取文件并直接返回?
【发布时间】:2018-02-27 16:47:08
【问题描述】:

我有一个可以获取并返回文件结果的内部 API。但是,此 API 没有任何身份验证/角色/权限检查的概念,因此无法修改。

我想在现有的 ASP.NET Core 2 Web API 上创建一个 Web API 端点来进行权限检查,调用此内部 API 并将文件结果返回给 Web 客户端。

是否有可能让包装器 API 端点仅将其获取的任何内容作为文件结果传递,而无需重构响应(例如,指定文件名、内容类型等)?文件可以是图像、pdf、文档。我希望这个包装 API 只进行权限检查并使用某种 fileId 调用内部 API 端点,而不需要知道内容长度或类型。

【问题讨论】:

  • 你不能使用像 NGINX 这样的反向代理来做到这一点吗?或服务网关。
  • 不幸的是,我无法访问可以让我走这条路的资源。
  • 简短回答:不。您可以流式传输 HttpClient 响应正文,但您仍然必须手动设置状态代码和响应/内容标头。
  • 您可以考虑编写自己的IActionResult 实现来完成所有这些工作(即HttpClientResponseResult)。然后,您还可以向 Controller 添加扩展以利用此自定义实现,以便它像其他内置插件一样工作(即 return HttpClientResponse(response);
  • 第二个 API 可以公开访问吗?如果是这样,返回一个 302 将浏览器重定向到文件的 URL 怎么样?

标签: c# asp.net-core-2.0 asp.net-core-webapi


【解决方案1】:

根据@chris-pratt 的建议,结果证明重建结果并不像我最初预期的那样复杂。我最终实现了这种方式,以防有人需要在这里做类似的事情。

... some validation logic outside the scope of the question...
using (HttpClient client = new HttpClient())
                {
                    var file = await client.GetAsync($"{someURL}/{id}");
                    return new FileContentResult(await file.Content.ReadAsByteArrayAsync(), file.Content.Headers.ContentType.MediaType);
                }

【讨论】:

    猜你喜欢
    • 2015-03-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多