Модераторы: gambit
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> C# HttpWebRequest method PUT, Проблема с загрузкой файлов больше ~20mb 
:(
    Опции темы
Santa12
Дата 21.4.2011, 11:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


вечный чечако



Профиль
Группа: Участник
Сообщений: 46
Регистрация: 20.5.2009

Репутация: нет
Всего: нет



Люди добрые! На коленях взываю о помощи! Гугль уже от меня шарахается в страхе, и вся надежда на вас!
Пытаюсь соорудить простенький клиент для WebDav. Никаких проблем, практически, не возникало, пока я не попытался загрузить на сервер файл больше 20мб. И все. Три дня ползаю по инету, уже дошел до того, что тупо копирую все варианты апплоадов, пытаясь найти подходящий, но результат тот же самый:
маленькие файлы отправляются без проблем, большие выдают ошибки... Были и 411, и 417, и невозможно записать данные в сокет, и возможно маленький буфер, и требуется длинна, и соединение было завершено... Честно сказать, уже все и не упомню.
Из всего, что нашел в инете, было задать протокол System.Net.HttpVersion.Version10, KeepAlive = false, и Timeout'ы увеличить... не помогло ничего... 
В текущий момент использую код ниже. Да, отправлял как сразу весь массив байтов, так и блоками - разницы особой нет... пробовал от отчаяния и WebClient... 
Уверен, что как всегда проглядел какую-то ерунду ((((

 
Код

            string strAttachFile = "CABRK.DLL"; // файл который будет загружен на сервер
            string strFileName = strAttachFile;
            strFileName = Path.GetFileName(strFileName);
            HttpWebRequest myHttpWebRequest = (HttpWebRequest)WebRequest.Create(@"http://mysite.su/uploads/" + strAttachFile); //
            myHttpWebRequest.ProtocolVersion = System.Net.HttpVersion.Version10;
            myHttpWebRequest.KeepAlive = false;
            CredentialCache myCache = new CredentialCache(); 
            myCache.Add(new Uri("http://mysite.su"), "Basic", new NetworkCredential("login", "password")); 
            myHttpWebRequest.Credentials = myCache;
            
            BinaryReader rdr = new BinaryReader(File.OpenRead(@strAttachFile));
            byte[] data = rdr.ReadBytes((int)rdr.BaseStream.Length);
            myHttpWebRequest.Method = "PUT";
            myHttpWebRequest.ContentType = "application/x-www-form-urlencoded";
            myHttpWebRequest.SendChunked = true;
            myHttpWebRequest.Timeout = 10000;
            myHttpWebRequest.ContentLength = data.Length;
            
            Stream s = myHttpWebRequest.GetRequestStream();
            s.Write(data, 0, data.Length);
            s.Close();
            HttpWebResponse myHttpWebResponse =
            (HttpWebResponse)myHttpWebRequest.GetResponse();
            myHttpWebResponse.Close();


PM MAIL WWW ICQ   Вверх
jonie
Дата 21.4.2011, 21:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 5613
Регистрация: 21.8.2005
Где: Владимир

Репутация: 15
Всего: 118



а на самом сайте ограничения нет? Если не изменяет память то 20 мег например ограничения на аплоад в php по умолчанию....


--------------------
Что-то не поняли? -> Напейтесь до зеленых человечков... эта сверхцивилизация Вам поможет...
PM MAIL Jabber   Вверх
Santa12
Дата 21.4.2011, 23:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


вечный чечако



Профиль
Группа: Участник
Сообщений: 46
Регистрация: 20.5.2009

Репутация: нет
Всего: нет



Мммм... Это не сайт... Просто моему хостеру восхотелось заюзать вебдав. Через ssh мне с работы никак не попасть, а через плагин вебдав к ТС - свои глюки. Там проблема с удалением каталогов, с именами каталогов и файлов... Да и давно хотелось что-нибудь дельное написать. Прославиться в веках, среди жены и тещи ))))
Сниффер показывает, что плагин ТС работает через http 1.1, посылает один байт для аутентификации, и заливает файл... Файл, в отличие от моего способа, появляется на сервере сразу, постепенно набирая размер. Если аплоад прервать, остается неполный файл.
Увеличив myHttpWebRequest.Timeout до 20000000 файл я загружаю... сто мегабайт за полчаса - сорок минут. С работы это не проходило, видно там прокси где-то в управе есть... Код немного изменил, загружаю массивами байтов [4096]. Судя по отладчику, сперва все эти массивы копируются в поток, потом долгое подвисание, и только потом, файл появляется на сервере...
В гугле нашел несколько похожих проблем, с загрузкой файлов больше 20мб... Решений или нет, или они не работают... Одно решение я не понял как сделать. Там советовали использовать не Stream а MemoryStream и писать WriteTo(). Человек отзывался, что это помогло... Но вот мой несовершенный мозг нифига не понял... На stackoverflow видел...



PM MAIL WWW ICQ   Вверх
jonie
Дата 22.4.2011, 09:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 5613
Регистрация: 21.8.2005
Где: Владимир

Репутация: 15
Всего: 118



веб дав это тоже просто сайт, и на чем он реализован (на пхп или на чем то еще) хрен его знает 8-)
надо пробывать в общем нам, так - пальцем в небо...


--------------------
Что-то не поняли? -> Напейтесь до зеленых человечков... эта сверхцивилизация Вам поможет...
PM MAIL Jabber   Вверх
Santa12
Дата 22.4.2011, 15:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


вечный чечако



Профиль
Группа: Участник
Сообщений: 46
Регистрация: 20.5.2009

Репутация: нет
Всего: нет



Мммм... Не соглашусь ) WevDav - это защищенный сетевой протокол, поверх HTTP. Более защищенный и надежный чем FTP. В свою очередь, тоже имеет расширения. Смешивать понятия сайт и протокол, имхо, не совсем правильно ) Но это лирика..
В общем, да, загружаю файлы, но установив безумный таймаут - это раз, и второе: 100 мегабайт в час. Честно сказать, я от таких скоростей уже даже отвык. Плюс, получается невозможность отследить объем переданных данных. Если я ошибаюсь, поправьте: для работы, к примеру, прогрессбара, в цикле передаем данные блоками по n-байт, и привязываем это дело к прогресс бару? Здесь получается: цикл проходит довольно быстро, как бы это и должно быть по рассчетной скорости, но потом, на час мы замираем на .GetResponse(). Я так понимаю, это как раз по причине установленного таймаута. Если таймаут убрать, то после того, как в цикле все уходит, на .GetResponse() получаю WebExceptions: request was aborted: request was canceled.
В общем, решения я так и не нахожу, увы. В виду этого, задам еще вопрос:
есть ли функция дописки файла? Я имею в виду, разбить файл на блоки по 20мб, раз уж они безпроблемные, и так и заливать, дописывая очередной кусок в конец текущего файла. Перезапись, я передаю: "Overwrite" в заголовке.
Или вообще забыть про HttpWebRequest и вооружаться сокетами (честно сказать, к ним-то я давно хотел подобраться)
Выслушаю любые советы...
PM MAIL WWW ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
cully
mr.DUDA
Exception

Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов.

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, cully, mr.DUDA, Exception.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Распределённые приложения и сеть | Следующая тема »


 




[ Время генерации скрипта: 0.0445 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.