有没有一种干净的方法可以将收到的响应中的数据传递给我自己的响应
本文关键字:响应 数据 自己的 我自己 一种 方法 有没有 | 更新日期: 2023-09-27 18:04:28
我有一个项目,我的一个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
已经被using
语句Dispose
d了。
我可以去掉using
,但这似乎不干净,留下了一个可以使用Dispose
的对象。
我尝试的其他一切似乎要么让其他Dispose
可用对象潜伏在周围(前提是在GC扫描导致它们成为Dispose
d之前使用它们(,要么我必须将所有内容加载到例如一个大的byte[]
中并消耗大量内存。
理想情况下,我会使用公开的流接口,这样我就不必将所有内容加载到内存中,但我似乎找不到在这里使用的正确咒语。
但这不起作用——当它真正尝试消费/使用内容时,它已经是
Dispose
天了,因为它到达的HttpResponseMessage
已经被using
语句Dispose
天了。
我有时是个笨蛋——是的,"包含"对象是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个小时来思考这个问题。在问了关于SO的问题10分钟后,我现在有了一个解决方案。当然,我会保留这一点,以防人们能想出更好的解决方案,或者只是想对问题或答案发表评论。