在 .NET 核心中返回 HttpResponseMessage 时出错

Posted

技术标签:

【中文标题】在 .NET 核心中返回 HttpResponseMessage 时出错【英文标题】:Error while returning HttpResponseMessage in.NET core 【发布时间】:2020-01-13 23:13:28 【问题描述】:

我有一个简单的 API 网关控制器,它返回一个 IActionResult。问题是我无法阅读响应的正文。

如果我注释掉 ExecuteResultAsync 中的 using 块,它似乎工作正常,但没有内容/正文。

不确定如何使用返回的 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();
        
    

【问题讨论】:

【参考方案1】:

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

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);
    

【讨论】:

以上是关于在 .NET 核心中返回 HttpResponseMessage 时出错的主要内容,如果未能解决你的问题,请参考以下文章

Azure Functions 3.1 .NET Core HttpResponse 在序列化对象上更改大小写

Django HttpResponse与JsonResponse

在调用不同 API 的 APIController 方法中返回 HttpResponse

是否可以在视图django中添加方法,用于在httpresponse中返回方法返回字符串的类视图中[关闭]

在 django 1.5 CBV 中返回 HttpResponse 时的 simplejson 错误

ValueError - 视图没有返回 HttpResponse 对象。它返回 None 而不是