У меня есть проект, в котором один из моих методов действия веб-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[]
и потреблять партии памяти.
В идеале я бы использовал интерфейсы потока, которые были открыты, поэтому мне не нужно загружать весь контент в память, но я просто не могу найти правильное заклинание для использования здесь.
Но это не сработает - к тому времени, когда он на самом деле пытается использовать/использовать контент, он был
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 минут после того, как задал вопрос о SO, у меня теперь есть исправление. Конечно, я оставлю это открытым, если люди могут придумать лучшие решения или просто захотят прокомментировать вопрос или ответ.