HttpWebRequest. GetResponse () зависает во второй раз, когда это называют

Я пытаюсь выбрать серию файлов через HTTP, с помощью HttpWebRequest. Первый запрос проходит прекрасный, но во второй раз через тот же код GetResponse () зависает и испытывает таймаут. WireShark показывает, что никакой Трафик HTTP не отправляется за вторым запросом, таким образом, казалось бы, что это - проблема API.

После некоторого расследования я обнаружил, что оно имеет отношение к определению довольной длины: если я пропускаю это, то код хорошо работает.

Мой код:

HttpWebRequest  httpWebRequest = ConfigureRequest();

using (WebResponse webResponse = httpWebRequest.GetResponse())
    // On the second iteration we never get beyond this line
{
    HttpWebResponse httpWebResponse = webResponse as HttpWebResponse;

    using (Stream webResponseStream = httpWebResponse.GetResponseStream())
    {
        if (webResponseStream != null)
        {
            // Read the stream
        }
    }

    statusCode = httpWebResponse.StatusCode;
    httpWebResponse.Close();
}

Признаки кажутся очень похожими на этот вопрос и этот вопрос, но в обоих случаях данный совет состоит в том, чтобы избавиться от WebResponse, который я уже делаю.

Редактирование В ответ на Gregory, вот ConfigureRequest ():

private HttpWebRequest ConfigureRequest()
{
    string          sUrl            = CreateURL(bucket, key);
    HttpWebRequest  httpWebRequest  = WebRequest.Create(sUrl) as HttpWebRequest;

    httpWebRequest.AllowWriteStreamBuffering = false;
    httpWebRequest.AllowAutoRedirect = true;
    httpWebRequest.UserAgent = this.m_sUserAgent;
    httpWebRequest.Method = "GET";
    httpWebRequest.Timeout = this.m_iTimeout;

    // *** NB: This line was left out of my original posting, and turned out to be
    // crucial
    if (m_contentLength > 0)
        httpWebRequest.ContentLength = m_contentLength;

    httpWebRequest.Headers.Add(StaticValues.Amazon_AlternativeDateHeader, timestamp);
    httpWebRequest.Headers.Add(StaticValues.HttpRequestHeader_Authorization, StaticValues.Amazon_AWS + " " + aWSAccessKeyId + ":" + signature);

    return httpWebRequest;
}

Править: Оказывается, что я фиксировал кардинальный грех удаления кода от моего вопроса, который я не проверил, было не связано с проблемой. Я удалил следующие строки:

    if (m_contentLength > 0)
        httpWebRequest.ContentLength = m_contentLength;

потому что я думал, что довольная длина никогда не будет указываться для ПОЛУЧИТЬ запроса. Оказывается, что я был неправ. Удаление этой строки решает проблему.

Единственный вопрос, который я теперь имею, состоит в том почему? Я думаю длина содержания, которая указана, корректно, хотя возможно, что это выключено одним. Был бы, указывая длину содержания, которая слишком коротка, препятствуют тому, чтобы полная загрузка произошла, и заставляют соединение быть оставленным открытым? Я ожидал бы, что Близко () и / или Располагают (), должен уничтожить соединение так или иначе.

26
задан Community 23 May 2017 в 12:17
поделиться

1 ответ

Мой ответ такой, потому что я пока не могу добавить комментарии.

«Можно добавить атрибут в элемент products, указывающий, какой продукт представлен»

Это решение приводит к другой проблеме: проверке того, указывает ли атрибут на существующий элемент.

<products featured_id="3">
  <product id="1">Prod 1</product>
  <product id="2">Prod 2</product>
</products>
-121--3866448-

Java 6 (от Sun) поставляется со встроенным интерпретатором JavaScrip.

http://java.sun.com/javase/6/docs/technotes/guides/scripting/programmer_guide/index.html#jsengine

-121--545953-

Убедитесь, что каждый раз создается НОВЫЙ WebWebRequest. Цитата из ссылки MSDN на метод GetResponse :

Возврат нескольких вызовов GetResponse один и тот же объект ответа; запрос не переиздается.

1 обновления: Ок. Как насчет того, чтобы попытаться закрыть webResponseStream тоже - в настоящее время вы этого не делаете, вы закрываете только webResponse (просто пытаетесь исключить вещи). Кроме того, я бы также распорядился (а не только WebResponse)

Обновить 2: Единственное, что я могу предложить, это взглянуть на следующие статьи, которые я посмотрел, когда сделал что-то похожее на то, что вы делаете:
http://arnosoftwaredev.blogspot.com/2006/09/net-20-httpwebrequestkeepalive-and.html
http://www.devnewsgroups.net/dotnetframework/t10805-exception-with-httpwebrequest-getresponse.aspx

Единственное заметное, что я делаю другое:
- задать веб-запрос. KeepAlive = false
- У меня нет функций управления подключением в конфигурации (я не закольцовываю, чтобы сделать ряд запросов)

8
ответ дан 28 November 2019 в 17:23
поделиться
Другие вопросы по тегам:

Похожие вопросы: