-1

我有一个简单的 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();
        }
    }
}
4

1 回答 1

0

试试这个,基于这个对类似问题的好回答ObjectResult,我使用了类而不是手动操作流。objectResult当我使用来自我们的一个 API (JSON) 的响应运行它时,我在它调用时的主体中ExecuteAsync获得与初始响应中相同数量的数据。

public class HttpResponseMessageResult : IActionResult
{
    private readonly HttpResponseMessage _responseMessage;
    public HttpResponseMessageResult(HttpResponseMessage responseMessage)
    {
        _responseMessage = responseMessage;
    }

    public async Task ExecuteResultAsync(ActionContext context)
    {
        var objectResult = new ObjectResult(await _responseMessage.Content.ReadAsStreamAsync())
        {StatusCode = (int)_responseMessage.StatusCode};
        foreach (KeyValuePair<string, IEnumerable<string>> h in _responseMessage.Headers)
        {
            context.HttpContext.Response.Headers.TryAdd(h.Key, string.Join("", h.Value));
        }

        await objectResult.ExecuteResultAsync(context);
    }
}
于 2019-09-20T13:40:29.187 回答