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

Тема в разделе ".NET", создана пользователем xfolder, 17 дек 2006.

Статус темы:
Закрыта.
  1. xfolder

    xfolder Гость

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

    Dr.Gigabit Гость

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

    62316e Гость

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

    xfolder Гость

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

    karlito Гость

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

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

    xfolder Гость

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


    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()
     
  7. karlito

    karlito Гость

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

    xfolder Гость

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

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

    Dr.Gigabit Гость

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

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

    xfolder Гость

    NET 2.0

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

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

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

    Код (Text):
    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
     
  11. xfolder

    xfolder Гость

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

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

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

    и все заработало
     
  12. Dr.Gigabit

    Dr.Gigabit Гость

    Аминь! B)
     
Загрузка...
Похожие Темы - Проблема Webrequest или
  1. c0de3r
    Ответов:
    5
    Просмотров:
    119
  2. DobermannTT
    Ответов:
    10
    Просмотров:
    133
  3. SoulPaladin
    Ответов:
    4
    Просмотров:
    127
  4. Artael
    Ответов:
    1
    Просмотров:
    109
  5. ENSLER
    Ответов:
    0
    Просмотров:
    102
Статус темы:
Закрыта.

Поделиться этой страницей