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

  • Автор темы xfolder
  • Дата начала
Статус
Закрыто для дальнейших ответов.
X

xfolder

#1
Ребята нагрнянула проблема, написал программу которая через 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
 
D

Dr.Gigabit

#2
Проблем может быть несколько.
Какая версия .NET? Приведенного кода недостаточно, т.к. тут не видно, как реализован механизм ассинхронности.
 
6

62316e

#3
Была подобная проблема с WebRequest - стало лень возитса и вылавлевать это заклинания под номером "3964". Есть спел такой CURL - он вроди помог, хотя...
 
X

xfolder

#4
в том то и дело, ребята если есть рабочий пример без использования HttpWebrequest скиньте пожалуйста
 
K

karlito

#5
Очень похоже на утечку ресурсов.
Вставь после 3963-запроса
Код:
GC.Collect();
GC.WaitForPendingFinalizers();
GC.Collect();
, если ничего не упадёт на 3964-ом запросе и дальше, то звони в бубны - что-то у тебя с кодом.

Вообще мне вот эти куски не нравятся очень.
Код:
Dim readStream As New StreamWriter(GR.GetRequestStream())
Код:
Dim sr As StreamReader = New StreamReader(GR.GetResponse().GetResponseStream(), Encoding.GetEncoding(0))
ты уверен, что все ресурсы закрываешь?
ты обёртываешь исходный поток ещё одним потоком, и на нём вызываешь Dispose(), а ты уверен, что исходный поток закрылся.
я бы написал вот так (приношу извинения, что пишу на C#)
Код:
using(Stream reqStream = GR.GetRequestStream())
using(StreamWriter writer = new StreamWriter(reqStream))
{
writer.Write("Query");
}
3964 - скорее всего количество доступных незанятых сокетов.
 
X

xfolder

#6
я немного поправил код, теперь закрываю вроде все но проблема до сих пор присутствует :)


Dim GR As HttpWebRequest = CType(HttpWebRequest.Create(Settings.RisServer & IIf(Settings.RisPort = 0, "", ":" & Settings.RisPort)), HttpWebRequest)
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()
foo.Close() : foo.Dispose()

Dim myHttpWebResponse As HttpWebResponse = CType(GR.GetResponse, HttpWebResponse)

Dim streamResponse As Stream = myHttpWebResponse.GetResponseStream()
Dim streamRead As New StreamReader(streamResponse)
Result = streamRead.ReadToEnd()

streamResponse.Close() : streamResponse.Dispose()
streamRead.Close() : streamRead.Dispose()

myHttpWebResponse.Close()
 
K

karlito

#7
Для: xfolder
Вставь ВРЕМЕННО в конце своего цикла
Код:
GC.Collect();
GC.WaitForPendingFinalizers();
GC.Collect();
и убедись, что действительно утечка происходит.
 
X

xfolder

#8
karlito, сделал но это не помогло.

странно все это, пауза в 5 минут помогает возобновить работу но это не решение.
 
D

Dr.Gigabit

#9
Судя по симптомам, ты исперпываешь кол-во доступных потоком в ThreadPool'e. Причина может быть либо смешивание синхронных и ассинхронных вызовов, либо некорректная работа с ресурсами, как уже указали.

Версия дотнета какая? Есть нюансы, связанные с 1.1 и 2.0.
 
X

xfolder

#10
NET 2.0

сейчас сделал новый проект, один thread, кручу в loop запросы, проблема как была так и осталась ;)

сервер работает на unix, cейчас для теста сделал .net webservice и на 3964-ом запросе получил такою же ошибку

вот полный код

Код:
Public Sub REQ(ByVal Query As String, Optional ByVal ThreadName As String = "", Optional ByVal Timeout As Integer = 10000)

Dim Result As String = ""
Dim L As ListViewItem
Dim url As String = "http://XXX.XXX.XXX.XXX"

If lst.Items.Count > 50 Then lst.Items.RemoveAt(0)

Try

Dim GR As HttpWebRequest = CType(HttpWebRequest.Create(url), HttpWebRequest)
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()
foo.Close() : foo.Dispose()

Dim myHttpWebResponse As HttpWebResponse = CType(GR.GetResponse, HttpWebResponse)

Dim streamResponse As Stream = myHttpWebResponse.GetResponseStream()
Dim streamRead As New StreamReader(streamResponse)
Result = streamRead.ReadToEnd()

streamResponse.Close() : streamResponse.Dispose()
streamRead.Close() : streamRead.Dispose()

myHttpWebResponse.Close()

L = lst.Items.Add(Result)
L.ForeColor = Color.Green


lbl_c.Text += 1

Catch ex As Exception

L = lst.Items.Add(ex.Message)
L.ForeColor = Color.Red

End Try

End Sub
 
X

xfolder

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

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

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

и все заработало
 
Статус
Закрыто для дальнейших ответов.