Есть ли чистый способ передачи данных из полученного ответа на мой собственный ответ?

1

У меня есть проект, в котором один из моих методов действия веб-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[] и потреблять партии памяти.

В идеале я бы использовал интерфейсы потока, которые были открыты, поэтому мне не нужно загружать весь контент в память, но я просто не могу найти правильное заклинание для использования здесь.

Теги:
proxy
asp.net-web-api

1 ответ

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 минут после того, как задал вопрос о SO, у меня теперь есть исправление. Конечно, я оставлю это открытым, если люди могут придумать лучшие решения или просто захотят прокомментировать вопрос или ответ.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню