2013-04-08 2 views
1

У меня есть ситуация, сводящая меня с ума, и нет никакой реальной информации в Интернете, которая помогает.HttpWebRequest Aborting After Callling GetResponse()

Я автоматизирую ручной процесс для загрузки файла. Я на самом деле написал этот код, как 3 года назад, и он работал без сбоев в течение года, теперь он прерывается с перерывами. Рассматривая трафик Fiddler для моих запросов и запросов, только что сделанных из браузера, единственные различия, которые я вижу, это то, что в скрипаче я получаю этот красный круг с строкой через него дважды во время моих автоматических вызовов.

Мои исследования показывают, что этот значок означает, что клиент прервал сеанс - чего я не делал. Я передаю тот же объект CookieContainer с каждым запросом. Я не знаю, почему это происходит, но если просмотреть свойства вошедшей линии в Скрипач он говорит, что это для моих автоматических запросов:

SESSION STATE: Aborted. 
... 
X-ABORTED-WHEN: SendingResponse 
... 
== TIMING INFO ============ 
ClientConnected: 16:25:58.563 
ClientBeginRequest: 16:25:58.566 
GotRequestHeaders: 16:25:58.567 
ClientDoneRequest: 16:25:58.567 
Determine Gateway: 0ms 
DNS Lookup:   0ms 
TCP/IP Connect: 0ms 
HTTPS Handshake: 0ms 
ServerConnected: 16:25:58.207 
FiddlerBeginRequest: 16:25:58.567 
ServerGotRequest: 16:25:58.567 
ServerBeginResponse: 16:25:58.922 
GotResponseHeaders: 16:25:58.922 
ServerDoneResponse: 16:25:59.268 
ClientBeginResponse: 16:25:59.268 
ClientDoneResponse: 16:25:59.268 

Той же линия из журнала я получаю в браузере выглядит следующим образом :

SESSION STATE: Done. 
... 
ClientConnected: 10:33:09.347 
ClientBeginRequest: 10:33:11.982 
GotRequestHeaders: 10:33:11.982 
ClientDoneRequest: 10:33:11.982 
Determine Gateway: 0ms 
DNS Lookup:   0ms 
TCP/IP Connect: 0ms 
HTTPS Handshake: 0ms 
ServerConnected: 10:33:08.050 
FiddlerBeginRequest: 10:33:11.982 
ServerGotRequest: 10:33:11.982 
ServerBeginResponse: 10:33:12.337 
GotResponseHeaders: 10:33:12.337 
ServerDoneResponse: 10:33:12.511 
ClientBeginResponse: 10:33:12.511 
ClientDoneResponse: 10:33:12.514 

Так что «сделано» против «Прервано». Я никогда не вызывал Abort по просьбе, и я не получаю никаких исключений. Вот мой код, где происходит преждевременное прекращение:

using (WebResponse httpResponse = httpRequest.GetResponse()) 
{ 
    if (!httpResponse.ResponseUri.AbsoluteUri.Equals(string.Format("{0}main.htm", url), StringComparison.CurrentCultureIgnoreCase)) 
    { 
     throw new Exception("Log in failed. Check the Username and Password information in the Setting table."); 
    } 

    httpResponse.Close(); 
} 

Я попытался убирая «с помощью» (хотя это рекомендуется) и «Закрыть» (также рекомендуется) и по-прежнему получает прервана.

Я ценю это

+0

Если вам нужны только заголовки (т. Е. Вам не нужен поток ответов), возможно, вы должны сделать запрос «ГОЛОВА». –

ответ

1

Я столкнулся с этим вопросом, и я понял, что если поток ответа не читается (или доступ), запрос в Скрипач сообщает, что она была прервана. Для моего случая использования мне не обязательно было читать поток ответов, но я добавил немного кода для чтения потока ответов (который я не буферировал или не сохранил), а затем Fiddler сообщил о выполненных запросах. Код, который у вас выше, не читает поток ответов, поэтому я бы попробовал это.

 using (WebResponse httpResponse = httpRequest.GetResponse()) 
     { 
      if (!httpResponse.ResponseUri.AbsoluteUri.Equals(string.Format("{0}main.htm", url), StringComparison.CurrentCultureIgnoreCase)) 
      { 
       throw new Exception("Log in failed. Check the Username and Password information in the Setting table."); 
      } 

      var responseStream = httpResponse.GetResponseStream(); 
      if (null != responseStream) 
      { 
       var buffer = new byte[8192]; 
       while (responseStream.Read(buffer, 0, buffer.Length) > 0) 
       { 
        // Do nothing here. 
       } 
      } 

      httpResponse.Close(); 
     } 
Смежные вопросы