На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
  
> Передача данных по HTTP протоколу
    Привет!
    Есть клиент и серевер, передача данных осуществляется от клиента к серверу по HTTP-протоколу.


    HttpWebRequest _request = (HttpWebRequest)WebRequest.Create(_address);
    _request.Method = "PUT";
    _request.Timeout = Timeout.Infinite;
    _request.ReadWriteTimeout = Timeout.Infinite;
    _request.KeepAlive = false;
    _request.SendChunked = true;
    _request.AllowWriteStreamBuffering = false;
    Stream stream = _request.GetRequestStream();
    ...........................................
    try
    {
    while(_buffer.Count > 0)
    {
    ..............
    var bytesToWrite = .........
    stream.Write(bytesToWrite, 0, bytesToWrite.Length);
    }
    }
    catch
    {

    }

    Во время выполнения цикла я отключаю сетевое соединение (или просто выдераю сетевой кабель) при этом еще секунд 10
    цикл продолжает посылать данные, т.е. ф-я stream.Write(...) отрабатывает, на сервер естественно ничего не приходит и только через некоторое время ф-я выкидывает исключение из-за отсутствия сетевого соединения.
    Почему так происходит и как своевременно отловить момент когда прерывается соединение???
    Сообщение отредактировано: Eneten -
      Чем вам исключение не устраивает?
        Цитата Eneten @
        Почему так происходит и как своевременно отловить момент когда прерывается соединение???

        спросить сервер, а сколько он реально принял данных при прошлой попытке...
          Цитата SPM @
          Чем вам исключение не устраивает?

          Исключение выкидывается не сразу, а через секунд 10 после того как выдергиваешь кабель. Функция Stream.Write(...) все это время вызывается
          нормально, какбуд-то все хорошо отсылается. Но сети при этом уже нет.

          Добавлено
          Цитата Spawn.NET @
          Цитата Eneten @
          Почему так происходит и как своевременно отловить момент когда прерывается соединение???

          спросить сервер, а сколько он реально принял данных при прошлой попытке...

          Хотелось бы не прибегать к таким сложным механизмам, а просто на стороне клиента как-то узнать есть ли соединение......
          Наверняка это возможно
            Этот механизм позволяет сокетам работать устойчиво при больших лагах сети. Не стоит смущаться, что в сокет уходят данные, а по сети они не передаются. Вы можете попробовать настроить таймауты сокета и его размер буфера.

            При разрыве соединения по техническим причинам, это нормальная работа сокета.
              Цитата maxim84_ @
              Этот механизм позволяет сокетам работать устойчиво при больших лагах сети. Не стоит смущаться, что в сокет уходят данные, а по сети они не передаются. Вы можете попробовать настроить таймауты сокета и его размер буфера.

              При разрыве соединения по техническим причинам, это нормальная работа сокета.

              maxim84, я как раз пытаюсь понять сегодня полдня как настроить объект HttpWebRequest,
              но что-то ничего не помогает :wall:
              Ты знаешь что конкретно нужно настроить???
                Stream

                Цитата
                ReadTimeout - Gets or sets a value, in miliseconds, that determines how long the stream will attempt to read before timing out.
                WriteTimeout - Gets or sets a value, in miliseconds, that determines how long the stream will attempt to write before timing out.


                не оно?
                  Цитата maxim84_ @
                  Stream

                  Цитата
                  ReadTimeout - Gets or sets a value, in miliseconds, that determines how long the stream will attempt to read before timing out.
                  WriteTimeout - Gets or sets a value, in miliseconds, that determines how long the stream will attempt to write before timing out.


                  не оно?

                  Нет!
                  MSDN The number of milliseconds before the writing or reading times out. The default value is 300,000 milliseconds (5 minutes).
                  Это значение указывает на время которое будет поддерживаться соединение в случае если мы не читаем и не пишем в stream ничего.
                  Т.е. 5 минут мы ничего не писали - соединение закрывается!
                    тогда, наверно вот это: http://msdn.microsoft.com/en-us/library/ee436612.aspx

                    Добавлено
                    Цитата
                    Т.е. 5 минут мы ничего не писали - соединение закрывается!

                    я вообще-то про stream говорил:
                    ExpandedWrap disabled
                      Stream stream = _request.GetRequestStream();
                      stream.ReadTimeout = 1000;
                      stream.WriteTimeout = 10;


                    Добавлено
                    ExpandedWrap disabled
                      _request.ReadWriteTimeout = Timeout.Infinite;

                    Почему Timeout.Infinite?

                    Добавлено
                    и всеже мне не понятно почему исключение не подходит... зачем сокращать тайминги и без того тормознутого протокола?
                    Сообщение отредактировано: maxim84_ -
                      Цитата maxim84_ @
                      тогда, наверно вот это: http://msdn.microsoft.com/en-us/library/ee436612.aspx

                      Добавлено
                      Цитата
                      Т.е. 5 минут мы ничего не писали - соединение закрывается!

                      я вообще-то про stream говорил:
                      ExpandedWrap disabled
                        Stream stream = _request.GetRequestStream();
                        stream.ReadTimeout = 1000;
                        stream.WriteTimeout = 10;


                      Добавлено
                      ExpandedWrap disabled
                        _request.ReadWriteTimeout = Timeout.Infinite;

                      Почему Timeout.Infinite?

                      Добавлено
                      и всеже мне не понятно почему исключение не подходит... зачем сокращать тайминги и без того тормознутого протокола?

                      ExpandedWrap disabled
                        _request.ReadWriteTimeout = Timeout.Infinite;

                      Infinite - потому что мы хотим поддерживть соединение как можно дольше в случае когда
                      передача данных не осуществлется.

                      Исключение не подходит потому что оно выкиывается слишком поздно после того как
                      соединение обрывается. Не сразу. Несколько пакетов при этом успевает "отослаться". Т.к. соединения нет
                      естественно эти нескоько пакетов теряются!

                      Добавлено
                      tream.ReadTimeout = 1000;
                      stream.WriteTimeout = 10;

                      Не работает. Все тоже самое. Исключение отлавливается на 15 секунд позже отключения соединения!
                        Значит разбейте данные на небольшие блоки, проиндексируйте их, и после разрыва соединения смотри какой блок не отправился, и с него продолжайте отправку как только соединение будет установлено.
                          Цитата maxim84_ @
                          Значит разбейте данные на небольшие блоки, проиндексируйте их, и после разрыва соединения смотри какой блок не отправился, и с него продолжайте отправку как только соединение будет установлено.

                          Да придется так и делать.
                          Спасибо!
                          0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
                          0 пользователей:


                          Рейтинг@Mail.ru
                          [ Script execution time: 0,0432 ]   [ 17 queries used ]   [ Generated: 16.04.24, 14:30 GMT ]