在 ASP.NET Core 中有效地转发来自内部 HttpClient 调用的内容

Posted

技术标签:

【中文标题】在 ASP.NET Core 中有效地转发来自内部 HttpClient 调用的内容【英文标题】:Efficiently forward content from internal HttpClient call in ASP.NET Core 【发布时间】:2017-05-07 11:29:57 【问题描述】:

我正在从我的 ASP.NET Core 应用程序调用内部 HTTP 服务。此服务的响应消息可能非常大,因此我希望尽可能高效地转发它们。如果可能的话,我只想将内容“映射”到控制器响应 - 或者换句话说,“将来自服务的流传输到流出我的控制器的流”。

到目前为止,我的控制器方法只是调用服务:

[HttpPost]
public Post([FromBody]SearchQuery searchQuery)

    var response = _searchClient.Search(searchQuery);
    // ?
 

服务由 HttpClient 实例调用。这里(作为一个例子)我只是返回 HttpContent,但当然我可以返回完全读取和序列化的主体(我显然不想要):

public async Task<HttpContent> Search(SearchQuery searchQuery)

    var content = new StringContent(TsearchQuery, Encoding.UTF8, "application/json");
    var response = await _httpClient.PostAsync("_search", content);
    return response.Content;

返回内容是否高效快捷?如何将控制器方法中的内容传递给响应? ASP.NET Core 是否在下面创建流?还是应该在我的代码中显式处理流?

【问题讨论】:

【参考方案1】:

您可以只从操作中返回 Stream,ASP.NET Core MVC 将有效地将其写入响应正文。

[HttpPost]
public async Task<Stream> Post([FromBody]SearchQuery searchQuery)

    var response = await _searchClient.Search(searchQuery);
    return await response.ReadAsStreamAsync();
 

【讨论】:

【参考方案2】:

根据我的经验,按照 David 的建议传递响应流是可行的,但不会维护 HTTP 状态代码。你必须添加这一行:

Response.StatusCode = (int)response.StatusCode;

This answer 提供了一种复制完整 HttpResponseMessage 的替代方法。

【讨论】:

以上是关于在 ASP.NET Core 中有效地转发来自内部 HttpClient 调用的内容的主要内容,如果未能解决你的问题,请参考以下文章

从内部网站为 ASP.NET Core 添加用户

来自 AuthorizationHandler (ASP.NET Core) 的自定义重定向

来自 ActionFilter 的 ModelState - ASP .NET Core 2.1 API

在 ASP.NET Core 中,是不是可以通过将身份验证转发到另一个方案来在一个方案中抢先创建新用户?

在 ASP.NET Core 中将 RTSP 流从 IP 摄像机转发到浏览器

一次业务网关用ASP.NET Core 2.1重构的小结