2010-11-12 10 views
2
WebClient wc = new WebClient(); 
wc.OpenReadCompleted += new OpenReadCompletedEventHandler(wc_OpenReadCompleted); 
wc.OpenReadAsync(new Uri(url, UriKind.RelativeOrAbsolute)); 


void wc_OpenReadCompleted(object sender, OpenReadCompletedEventArgs e) 
{ 
    if (e.Error != null || e.Cancelled) 
    { 
    //randomly, this code gets hit and 
    //there is no inner exception - just says "an exception occurred during a webclient request" 

Ошибка, описанная в коде, происходит случайным образом и если после этого выполняется тот же запрос веб-клиента. Или, если новый запрос ресурса сделан, старый, который получил ошибку, теперь приходит перед новым запросом ...Ошибка webclient (случайная и очень очень раздражающая)

Это очень странно, любые гуру здесь могут понять, почему это может быть?

EDIT: информация об ошибке

System.Net.WebException: исключение произошло во время запроса WebClient. ---> System.Exception ---> System.Exception: Ошибка HRESULT E_FAIL был возвращен из вызова компонента COM . на System.Net.BrowserHttpWebRequest.InternalEndGetResponse (IAsyncResult asyncResult) в System.Net.BrowserHttpWebRequest. <> c_ DisplayClass5.b _4 (Объект sendState) по адресу System.Net.AsyncHelper. <> c_ DisplayClass2.b _0 (Object sendState) --- Конец внутренней трассировки стека исключений --- у System.Net.AsyncHelper.BeginOnUI (SendOrPostCallback beginMethod, объект состояния) на System.Net.BrowserHttpWebRequest .EndGetResponse (IAsyncResult AsyncResult) при System.Net.WebClient.GetWebResponse (WebRequest запрос, IAsyncResult результат) на System.Net.WebClient.OpenReadAsyncCallback (IAsyncResult результат) --- Конец внутреннее исключение трассировки стека - -

URL-адрес простой строки, имеющей счетчик не более 200.

+1

Какой тип исключения? Вы пробовали смотреть на то, что происходит на сетевом уровне, используя Wireshark? –

+0

@Jon Skeet: exception = "исключение произошло во время запроса webclient", и это все, что я верну. Я не использовал Wireshark, но сразу установил его. Однако, используя скрипт, я даже не вижу HTTP-запрос, когда я получаю эту ошибку; Однако, когда я делаю еще один запрос WebClient - тот, в котором я получил ошибку, появляется в скрипаче (тип запроса = GET, HTTP/1.1), и новый запрос, который я сделал, также возникает после этого ....так что это очень странно. – VoodooChild

+0

(только для добавления в мой комментарий): после получения ошибки и отсутствия сеанса скрипача для нее - если я сделаю еще один звонок и теперь вижу два запроса, сделанных в скрипаче, и если я посмотрю подробности для запроса, когда я получил ошибку, я вижу, что отметка 'ClientBeginRequest' находится в более новое время, когда я сделал второй запрос. Таким образом, это почти похоже на то, что запрос webClient застрял где-то в памяти или буфере, а по следующему запросу он заставляет его выполнять. Кроме того, я установил WireShark, но с тех пор я не смог воссоздать эту ошибку :) - но я обновлю это, как только я это сделаю. – VoodooChild

ответ

2

Этот код будет удалён, если будет отменен или будет сгенерирована ошибка. Я подозреваю, что вы столкнулись с сетевой проблемой, поэтому я должен запустить Fiddler и посмотреть HTTP-запросы и убедиться, что вы правильно их вернули.

+0

Я согласен, но проблема, с которой я столкнулся, заключается в том, что HTTP-запрос, сделанный для моего вызова 'wc.OpenReadAsync (..)', когда я получаю ошибку. Однако, когда я делаю другой запрос, я вижу два сеанса скрипача для двух запросов, где я получил ошибку, а другой - только что сделал. Любые подсказки? – VoodooChild

+0

(только для добавления в мой комментарий): После получения ошибки и отсутствия сеанса скрипача для нее - если я сделаю еще один звонок и теперь вижу два запроса, сделанных в скрипаче, и если я посмотрю подробности для запроса, когда я получил ошибку, я вижу, что отметка 'ClientBeginRequest' находится в более новое время, когда я сделал второй запрос. Таким образом, это почти похоже на то, что запрос webClient застрял где-то в памяти или буфере, а по следующему запросу он заставляет его выполнять. – VoodooChild

+1

Звучит как сетевая буферизация. Сетевой стек Windows и потенциально ваша сетевая карта (физическое и драйверное программное обеспечение) реализуют буферы. Это может привести к тому, что сетевые запросы не будут работать точно так, как ожидалось. Вы также хотите проверить проблемы кэширования, у меня был тот же самый сценарий ранее (кроме моего клиента был IE 9), и именно кэширование переадресации IE 9 вызывало проблему: http://www.sadev.co.za/content/redirected-down-one-way-clearing-internet-explorer-host-redirect-cache Я сомневаюсь, что это ваша проблема, потому что ваш клиент - это код, но убедитесь, что вы не кэшируете где-либо код –

0

Я собираюсь опасаться, что это время. Я также буду предполагать, что это может быть проблема DNS.

Возможно, что DNS отключен. Это будет согласуется с тем, что вы не видите запрос в Fiddler.

Я полагаю, не исключено, что запрос будет заполнен позже, когда вы снова попробуете, и на этот раз DNS работает. Может быть. Этот момент я немного расплывчатый, но что угодно.

Если вы используете URL-адрес с IP-адресом вместо имени домена, у вас все еще есть такая же проблема?

+1

Неплохое предложение относительно время выхода; но, похоже, это проблема с резьбой. Поток пользовательского интерфейса, который вызывает метод webClient, может быть заблокирован и выполняет любые запросы в своей очереди при следующем использовании. – VoodooChild

0

Возможно, URL-адрес очень длинный. У меня такая же проблема на WP8 с длиной 2900 символов URL

Смежные вопросы