我有一个简单的 API 网关控制器,它返回一个IActionResult
. 问题是我无法阅读响应的正文。
如果我注释掉 using 块,ExecuteResultAsync
它似乎工作正常,但没有内容/正文。
不知道如何使用返回的 httpbody 来解决这个问题。RouteRequest 返回HttpResponseMessage
不是一个选项,因为它将来自微服务的响应作为来自网关的响应的主体。
所以我需要使用HttpResponseMessageResult
中间件,它可以按预期对标头起作用,但对正文不起作用。
public async Task<IActionResult> RouteRequest()
{
// Calls a method which send a request and gets a response and constructs a HttpResponseMessage
_contextAccessor.HttpContext.Response.RegisterForDispose(response);
return new HttpResponseMessageResult(response);
}
public class HttpResponseMessageResult : IActionResult
{
private readonly HttpResponseMessage _responseMessage;
public HttpResponseMessageResult(HttpResponseMessage responseMessage)
{
_responseMessage = responseMessage;
}
public async Task ExecuteResultAsync(ActionContext context)
{
context.HttpContext.Response.StatusCode = (int)_responseMessage.StatusCode;
var responseMessageHeadersArray = _responseMessage.Headers.ToArray();
for (int i = 0; i < responseMessageHeadersArray.Length; i++)
{
var header = responseMessageHeadersArray[i];
context.HttpContext.Response.Headers.TryAdd(header.Key, new StringValues(header.Value.ToArray()));
}
using (var stream = await _responseMessage.Content.ReadAsStreamAsync())
{
await stream.CopyToAsync(context.HttpContext.Response.Body);
await context.HttpContext.Response.Body.FlushAsync();
}
}
}