我有一个项目,其中一个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[]
并消耗大量内存。
理想情况下,我会使用暴露的流接口,这样我就不必将所有内容加载到内存中,但我似乎无法在这里找到正确的咒语。
答案 0 :(得分:0)
但这不起作用 - 当它实际尝试使用/使用内容时,它已经
Dispose
d,因为它到达的HttpResponseMessage
已经Dispose
dusing
声明。
我有时候这么多 - 是的,“包含”对象已经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分钟,我现在有一个修复。当然,如果人们可以提出更好的解决方案,或者只是想对问题或答案发表评论,我会保持开放状态。