是否有一种干净的方法将收到的响应中的数据传递给我自己的响应?

时间:2014-05-21 09:25:42

标签: c# asp.net asp.net-web-api proxy

我有一个项目,其中一个Web API操作方法希望有效地充当另一个服务中类似方法的代理。

因此,我们发出请求并创建响应:

var request = new HttpRequestMessage(HttpMethod.Get, remoteUri);
foreach (var mediaType in acceptableTypes)
{
    request.Headers.Accept.Add(mediaType);
}

using (var response = await _httpClient.SendAsync(request))
{
    if (response.StatusCode != HttpStatusCode.OK)
    {
        throw new Exception("Unexpected status: " +
             response.StatusCode.ToString() + " for the resource Uri " +
             resourceUri);
    }

    var msg = new HttpResponseMessage(HttpStatusCode.OK);
    msg.Content = response.Content;

    return msg;
}

但这不起作用 - 当它实际尝试使用/使用内容时,它已经Dispose d,因为它到达的HttpResponseMessage已经Dispose d using声明。

我可以取出using,但是这样做似乎并不干净,只留下潜伏的Dispose对象。

我尝试的其他所有内容似乎要么留下其他Dispose能够使用的对象(假设它们在GC扫描之前使用它们导致它们Dispose d),或者我必须加载一切都进入例如一个很大的byte[]并消耗大量内存。

理想情况下,我会使用暴露的流接口,这样我就不必将所有内容加载到内存中,但我似乎无法在这里找到正确的咒语。

1 个答案:

答案 0 :(得分:0)

  

但这不起作用 - 当它实际尝试使用/使用内容时,它已经Dispose d,因为它到达的HttpResponseMessage已经Dispose d using声明。

我有时候这么多 - 是的,“包含”对象已经Dispose d,因此内容已经Dispose d。处理此问题的干净方法是使收到的消息不再包含它。当然,它仍然包含在我正在发送的消息中,当消息传递时它将(适当地)得到清理。

所以修复只是:

using (var response = await _httpClient.SendAsync(request))
{
    if (response.StatusCode != HttpStatusCode.OK)
    {
        throw new Exception("Unexpected status: " +
             response.StatusCode.ToString() + " for the resource Uri " +
             resourceUri);
    }

    var msg = new HttpResponseMessage(HttpStatusCode.OK);
    msg.Content = response.Content;

    response.Content = null; //<-- New line here

    return msg;
}

我发誓当我提出这个问题时,我没有准备好这个答案。我花了2-3个小时抨击这个问题。在询问问题后10分钟,我现在有一个修复。当然,如果人们可以提出更好的解决方案,或者只是想对问题或答案发表评论,我会保持开放状态。