2017-05-07 20 views
5

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

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

[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是否在下面创建流?或者我应该明确处理我的代码中的流?

回答

4

您可以从操作中返回Stream,ASP.NET Core MVC将高效地将其写入响应主体。

[HttpPost] 
public async Task<Stream> Post([FromBody]SearchQuery searchQuery) 
{ 
    var response = await _searchClient.Search(searchQuery); 
    return await response.ReadAsStreamAsync(); 
} 
0

根据我的经验,按照David的建议工作,通过响应流,但不保持HTTP状态代码。你不得不加入这一行:

Response.StatusCode = (int)response.StatusCode; 

This answer提供复制一个完整的HttpResponseMessage的另一种方式。

相关问题