Проблема с WebRequest :( или как иначе?

Язык Visual Basic на платформе .NET.

Модераторы: Ramzes, Sebas

xfolder
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 133
Зарегистрирован: 22.07.2002 (Пн) 18:57
Откуда: United Kingdom

Проблема с WebRequest :( или как иначе?

Сообщение xfolder » 17.12.2006 (Вс) 18:07

Ребята нагрнянула проблема, написал программу которая через threads работает с удаленным сервером, но все в пределах локалки.
Программа запускает 20 threads которые посылают на тот сервер разные инструкции в XML формате и получают ответы.

Проблема в том что на 3964(+/- 3) запросе через webRequest он зараза перестает связыватся с сервером! просто выдает ошибку "unable to connect..."

замечу что с другой машины связь работает нормально, вроде бы все ок с тем удаленным сервером.

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

толи это баг в NET толи я чтото упустил. :(

вопрос в следующем если вы знаете что может влиять на соеденение в данном случае подскажите!

или

если есть примерчик отправления данных на RPC сервер и получения ответа без использования Webrequest пожалуйста скиньте код!

вот как я запрашиваю
>>>>>>>>>>>


Dim GR As WebRequest = HttpWebRequest.Create(Settings.RisServer & IIf(Settings.RisPort = 0, "", ":" & Settings.RisPort))
GR.Method = "POST"
GR.ContentType = "text/xml"
GR.ContentLength = Query.Length
GR.ConnectionGroupName = Tools.GetGuid
GR.Timeout = Timeout

Dim readStream As New StreamWriter(GR.GetRequestStream())
readStream.Write(Query)
readStream.Close()
readStream = Nothing

Dim sr As StreamReader = New StreamReader(GR.GetResponse().GetResponseStream(), Encoding.GetEncoding(0))
Result = sr.ReadToEnd()
sr.Dispose()
sr = Nothing

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 17.12.2006 (Вс) 18:17

Т.е. dispose ты вызываешь не у всего, а выборочно только у sr.
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

xfolder
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 133
Зарегистрирован: 22.07.2002 (Пн) 18:57
Откуда: United Kingdom

Сообщение xfolder » 17.12.2006 (Вс) 21:07

GSerg писал(а):Т.е. dispose ты вызываешь не у всего, а выборочно только у sr.


попробовал поставить на readStream но результат тот же самый, на 3995 запросе пропало соедение с сервером.

>>>>>>

Dim GR As WebRequest = HttpWebRequest.Create(Settings.RisServer & IIf(Settings.RisPort = 0, "", ":" & Settings.RisPort))
GR.Method = "POST"
GR.ContentType = "text/xml"
GR.ContentLength = Query.Length
GR.ConnectionGroupName = WsTools.GetGuid
GR.Timeout = Timeout

Dim readStream As New StreamWriter(GR.GetRequestStream())
readStream.Write(Query)
readStream.Close()
readStream.Dispose()
readStream = Nothing

Dim sr As StreamReader = New StreamReader(GR.GetResponse().GetResponseStream(), Encoding.GetEncoding(0))
Result = sr.ReadToEnd()
sr.Close()
sr.Dispose()
sr = Nothing

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 17.12.2006 (Вс) 21:11

Оставшиеся без Dispose объекты:
GR.GetRequestStream()
GR.GetResponse()
GR.GetResponse().GetResponseStream().
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

xfolder
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 133
Зарегистрирован: 22.07.2002 (Пн) 18:57
Откуда: United Kingdom

Сообщение xfolder » 17.12.2006 (Вс) 21:49

GSerg писал(а):Оставшиеся без Dispose объекты:
GR.GetRequestStream()
GR.GetResponse()
GR.GetResponse().GetResponseStream().


исправил, только GR.GetResponse не имеет методе dispose

но всеравно теряет соеденение.

:(


вот что получилось
>>>>>>>>>>>>
Dim GR As WebRequest = HttpWebRequest.Create(Settings.RisServer & IIf(Settings.RisPort = 0, "", ":" & Settings.RisPort))
GR.Method = "POST"
GR.ContentType = "text/xml"
GR.ContentLength = Query.Length
GR.ConnectionGroupName = WsTools.GetGuid
GR.Timeout = Timeout

Dim readStream As New StreamWriter(GR.GetRequestStream())
readStream.Write(Query)
readStream.Close()
readStream.Dispose()
readStream = Nothing
GR.GetRequestStream.Dispose()

Dim sr As StreamReader = New StreamReader(GR.GetResponse().GetResponseStream(), Encoding.GetEncoding(0))
Result = sr.ReadToEnd()
sr.Close()
sr.Dispose()
sr = Nothing
GR.GetResponse().GetResponseStream().Dispose()

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 17.12.2006 (Вс) 22:11

xfolder, ты не понял... Ты теперь повторно получашь новый streamreader и закрываешь его, а должен закрыть предыдущий...

Написано же чёрным по белому в документации...
MSDN писал(а):Внимание! Необходимо вызвать метод Stream.Close, чтобы закрыть поток и освободить подключение для повторного использования. Неудачное закрытие потока приведет к нехватке подключений для приложения.


Код: Выделить всё
Dim foo as stream = GR.GetRequestStream()
Dim readStream As New StreamWriter(foo)
readStream.Write(Query)
readStream.Close()
readStream.Dispose()
readStream = Nothing
foo.Close
foo.Dispose


Привыкай к недетерминированной деструкции, выдываемой за светлое будущее...
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

xfolder
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 133
Зарегистрирован: 22.07.2002 (Пн) 18:57
Откуда: United Kingdom

Сообщение xfolder » 18.12.2006 (Пн) 0:23

GSerg писал(а):xfolder, ты не понял... Ты теперь повторно получашь новый streamreader и закрываешь его, а должен закрыть предыдущий...


спасибо за помощь, я поправил код как ты показал но проблема не ушла :(

вот что получилось, если не трудно поправь что нужно
>>>>>>>>>>>>>>>>>>>>>>


Dim GR As WebRequest = HttpWebRequest.Create(Settings.RisServer & IIf(Settings.RisPort = 0, "", ":" & Settings.RisPort))
GR.Method = "POST"
GR.ContentType = "text/xml"
GR.ContentLength = Query.Length
GR.ConnectionGroupName = WsTools.GetGuid
GR.Timeout = Timeout

Dim foo As Stream = GR.GetRequestStream()
Dim readStream As New StreamWriter(foo)
readStream.Write(Query)
readStream.Close()
readStream.Dispose()
readStream = Nothing
foo.Close()
foo.Dispose()


Dim sr As StreamReader = New StreamReader(GR.GetResponse().GetResponseStream(), Encoding.GetEncoding(0))
Result = sr.ReadToEnd()
sr.Close()
sr.Dispose()
sr = Nothing
GR.GetResponse().GetResponseStream().Dispose()

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 18.12.2006 (Пн) 8:44

xfolder, я не буду править твой код, раз ты сам не захотел распространить показанный и очень простой принцип на все части когда, где его нужно применить, с учётом того, что даже все эти части я тебе перечислил.
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

xfolder
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 133
Зарегистрирован: 22.07.2002 (Пн) 18:57
Откуда: United Kingdom

Сообщение xfolder » 18.12.2006 (Пн) 13:03

GSerg писал(а):xfolder, я не буду править твой код, раз ты сам не захотел распространить показанный и очень простой принцип на все части когда, где его нужно применить, с учётом того, что даже все эти части я тебе перечислил.


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

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 18.12.2006 (Пн) 13:35

Если ты сам не можешь соединить http://bbs.vbstreets.ru/viewtopic.php?p=6644640#6644640 и http://bbs.vbstreets.ru/viewtopic.php?p=6644647#6644647, то я не знаю тогда.
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

xfolder
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 133
Зарегистрирован: 22.07.2002 (Пн) 18:57
Откуда: United Kingdom

Сообщение xfolder » 18.12.2006 (Пн) 16:45

GSerg писал(а):Если ты сам не можешь соединить http://bbs.vbstreets.ru/viewtopic.php?p=6644640#6644640 и http://bbs.vbstreets.ru/viewtopic.php?p=6644647#6644647, то я не знаю тогда.


будь добр обьясни толком, я посмотрел на твой пример, сделал вот так:


Код: Выделить всё
            Dim GR As WebRequest = HttpWebRequest.Create(Settings.RisServer & IIf(Settings.RisPort = 0, "", ":" & Settings.RisPort))
            GR.Method = "POST"
            GR.ContentType = "text/xml"
            GR.ContentLength = Query.Length
            GR.ConnectionGroupName = WsTools.GetGuid
            GR.Timeout = Timeout

            Dim foo As Stream = GR.GetRequestStream()
            Dim readStream As New StreamWriter(foo)
            readStream.Write(Query)
            readStream.Close()
            readStream.Dispose()
            readStream = Nothing

            foo.Close()
            foo.Dispose()

            Dim RS As Stream = GR.GetResponse().GetResponseStream()
            Dim SR As StreamReader = New StreamReader(RS, Encoding.GetEncoding(0))
            Result = SR.ReadToEnd()
            SR.Close()
            SR.Dispose()
            SR = Nothing

            RS.Close()
            RS.Dispose()


но всеравно проблема повторяется

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 18.12.2006 (Пн) 16:57

Блин, xfolder...
Да закрывай же наконец ВСЕ объекты, а не часть.
GR.GetResponse() - тоже объект с методом close, который надо вызвать. И его тоже давай в отдельную переменную.
Ну неужели трудно MSDN посмотреть на предмет ВСЕХ используемых классов?..
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

xfolder
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 133
Зарегистрирован: 22.07.2002 (Пн) 18:57
Откуда: United Kingdom

Сообщение xfolder » 18.12.2006 (Пн) 19:51

GSerg писал(а):Блин, xfolder...
Да закрывай же наконец ВСЕ объекты, а не часть.
GR.GetResponse() - тоже объект с методом close, который надо вызвать. И его тоже давай в отдельную переменную.
Ну неужели трудно MSDN посмотреть на предмет ВСЕХ используемых классов?..


ок, как я понял получается вот так, или опять чего упустил?

Код: Выделить всё


            Dim GR As WebRequest = HttpWebRequest.Create(Settings.RisServer & IIf(Settings.RisPort = 0, "", ":" & Settings.RisPort))
            GR.Method = "POST"
            GR.ContentType = "text/xml"
            GR.ContentLength = Query.Length
            GR.ConnectionGroupName = WsTools.GetGuid
            GR.Timeout = Timeout

            Dim foo As Stream = GR.GetRequestStream()
            Dim readStream As New StreamWriter(foo)
            readStream.Write(Query)
            readStream.Close()
            readStream.Dispose()
            readStream = Nothing

            foo.Close()
            foo.Dispose()

            Dim R As WebResponse = GR.GetResponse

            Dim RS As Stream = R.GetResponseStream()
            Dim SR As StreamReader = New StreamReader(RS, Encoding.GetEncoding(0))
            Result = SR.ReadToEnd()
            SR.Close()
            SR.Dispose()
            SR = Nothing

            RS.Close()
            RS.Dispose()

            R.Close()
            R = Nothing

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 18.12.2006 (Пн) 20:06

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

xfolder
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 133
Зарегистрирован: 22.07.2002 (Пн) 18:57
Откуда: United Kingdom

Сообщение xfolder » 19.12.2006 (Вт) 12:53

к сожалению проблема осталась, вопрос остается открытым.

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 19.12.2006 (Вт) 13:21

Значит остались другие аналогичные куски в программе.
Если регулярный (через каждую тысячу, скажем) вызов GC.Collect позволяет избежать проблемы, значит это действительно так.
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

xfolder
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 133
Зарегистрирован: 22.07.2002 (Пн) 18:57
Откуда: United Kingdom

Сообщение xfolder » 20.12.2006 (Ср) 14:19

GSerg писал(а):Значит остались другие аналогичные куски в программе.
Если регулярный (через каждую тысячу, скажем) вызов GC.Collect позволяет избежать проблемы, значит это действительно так.


сделал но проблема не исчезла...

есть ли какой-нибудь монитор ресурсов или что-то что можно использовать чтобы отследить в какой области возникает проблема?

Кроме как HttpWebRequest можно ли подругому делать такого рода запросы?

xfolder
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 133
Зарегистрирован: 22.07.2002 (Пн) 18:57
Откуда: United Kingdom

Сообщение xfolder » 21.12.2006 (Чт) 1:51

проблема решена!

просто нужно было добавить

GR.KeepAlive = False
GR.ServicePoint.MaxIdleTime = 3000

и все заработало

Fedorfx
Постоялец
Постоялец
 
Сообщения: 371
Зарегистрирован: 10.10.2002 (Чт) 0:14

Сообщение Fedorfx » 18.01.2007 (Чт) 2:10

xfolder писал(а):проблема решена!

просто нужно было добавить

GR.KeepAlive = False
GR.ServicePoint.MaxIdleTime = 3000

и все заработало


Что то я не могу найти этих свойстви в инстансах httpwebrequest.
Где они там спрятались ? или не там?


Вернуться в Visual Basic .NET

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 42

    TopList