Forums -> Глюкодром -> C# file download через php запрос.
| Full Version

Lexus
Ситуация:
Есть сайт на котором надо логинится, толко тогда появляются линки на скачивание.

линки такого вида: ...file.php/blabla.rar

Я логинюсь на сайт, беру куки в куки контейнер.
дальше делаю:

HttpWebRequest req = (HttpWebRequest)WebRequest.Create(url);
HttpWebResponse resp = (HttpWebResponse)req.GetResponse();

куки ясно прицепляю к запросу.

и на resp прога выдаёт timeout, хотя если делать request не на файл, а на любую страницу, то всё идет на ура и я получаю просто html той страницы.

Чего я не так понял в reg/res системе шарпа?
Brait
Какой-нибудь proxy-ёй (hint: Naviscope) либо packet sniffer-ом (hint: Iris network Traffic Analyser) глянь, возможно C# неправильно запрос формирует...
LF_
есть даровый снифер - http://www.wireshark.org/
Set
Может там реферер чекается для антиличивости.
Lexus
Покапал и выкапал. Что запрос идёт пралоьно, а не прально пашит второй запрос.
Т.е .если я делаю первым запросом логин и забираю кукисы.
Вторым запросом шлю запрос скачку и прицепляю кукисы - всё ок
и если я делаю ещё один запрос поху куда (второй файл, главная страница), то получаю timeout
Set
Может куки меняются?
Lexus
Секс продолждается. Попарившись, выяснил:
Иногда получается 2-3 запроса сделать, иногда 1-2.
Вот код:
QUOTE
string loginData = "username=UserLogin&password=UserPass";

Uri uri = new Uri("http://testpage.de");
CookieContainer cookieContainer = new CookieContainer();

HttpWebRequest sessionRequest = (HttpWebRequest)WebRequest.Create(uri);
sessionRequest.CookieContainer = new CookieContainer();
cookieContainer = sessionRequest.CookieContainer;
HttpWebResponse sessionResponse = (HttpWebResponse)sessionRequest.GetResponse();
sessionResponse.Close();



// Login
HttpWebRequest req = (HttpWebRequest)HttpWebRequest.Create("http://testpage.de/login.php");
req.CookieContainer = cookieContainer;
req.Method = "POST";
req.ContentType = "application/x-www-form-urlencoded";
ASCIIEncoding encoding = new ASCIIEncoding();
byte[] loginDataBytes = encoding.GetBytes(loginData);
req.ContentLength = loginDataBytes.Length;
Stream stream = req.GetRequestStream();
stream.Write(loginDataBytes, 0, loginDataBytes.Length);
stream.Close();
HttpWebResponse res = (HttpWebResponse)req.GetResponse();

// 2nd scratch
Encoding encodingRu = System.Text.Encoding.GetEncoding("windows-1251");
req = (HttpWebRequest)HttpWebRequest.Create(textBoxLink.Text);
req.CookieContainer = cookieContainer;
req.Method = "GET";
req.ContentType = "text/html";



res = (HttpWebResponse)req.GetResponse();
StreamReader sr = new StreamReader(res.GetResponseStream(), encodingRu);

inputText.Text = sr.ReadToEnd();
MessageBox.Show(res.StatusCode.ToString());
res.Close();
sr.Close();

textBoxLink.Text - с формы забирается стринг с линком.
Вся функция весит под кнопкой
Timeout выбивает всегда на красной строке
Brait
Стоило-бы проверить переменную textBoxLink, что в ней содержится, валидный ли URL? И еще, может стоит выдержать небольшую паузу между логином и запросом файла? А коннект логина точно закрылся? Кстати, о печенюшках: cookie после логина очень даже могли смениться...
Lexus
url 100% валидный, в кукас стоит что действительны до 2030 года.
Больше всего, что я не понимаю, почему то 3 то 2 запроса проходят. Ладно ни одного или хоть сколько :))
Set
Строку req.ContentType = "text/html"; убрать для GET.
Lexus
жо найдено, была по тупости два раза resзщтыу вызвана, что вешала всё дело.
Lord KiRon
QUOTE (Lexus @ 27-04-2009, 23:25)
жо найдено, была по тупости два раза resзщтыу вызвана, что вешала всё дело.
А по руссקи ? :diablo:
Lexus
QUOTE (Lord KiRon @ 28-04-2009, 15:57)
QUOTE (Lexus @ 27-04-2009, 23:25)
жо найдено, была по тупости два раза resзщтыу вызвана, что вешала всё дело.
А по руссקи ? :diablo:
Как я не навижу пунтусвичера и не могу без него :)))

response должно было стоять :)))
Brait
Так отключи у него автозамену. У меня он ради двух фич - переключение раскладок одним Ctrl, и история ClipBoard-а. Ну и еще иногда Shift-Break для введенного при неправильного выбранной раскладке.
Lexus
QUOTE (Brait @ 29-04-2009, 03:14)
Так отключи у него автозамену. У меня он ради двух фич - переключение раскладок одним Ctrl, и история ClipBoard-а. Ну и еще иногда Shift-Break для введенного при неправильного выбранной раскладке.
А я для буфера clipdiary юзаю, весчь!!!!

Как-то привык, что он сам переключает и даже иногда терплю через попность :)))