2010-04-22 3 views
2

ПРИМЕЧАНИЕ. Я исправил проблему с пользовательским агентом, а также добавил дополнительный байт, чтобы соответствовать длине содержимого. Однако не повезло.Почему .NET Post отличается от CURL? сломана?

Я не понимаю этого. Я запустил this code ниже, а результат строки json был истек (значение недействительно).

Однако код curl выполняет то же самое и работает. Я либо получаю ожидаемую строку с URL-адресом, либо говорит, что мне нужно ждать (от нескольких секунд до 1 минуты).

Почему? В чем разница между ними? Он выглядит очень F%^& * ed, что он ведет себя по-другому (его вызывало меня ЧАСЫ проблем).

ПРИМЕЧАНИЕ. Единственный файл cookie, требуемый сайтом, является SID (проверен). Он содержит идентификатор сеанса. Первое сообщение активирует его, а вторая команда проверяет состояние с возвращаемой строкой json. Не стесняйтесь устанавливать CookieContainer только для использования SID, если хотите.

ВНИМАНИЕ: вы можете изменить SID на другое значение, чтобы другие люди не активировали его. Возможно, вы захотите запустить второй URL-адрес, чтобы убедиться, что идентификатор сеанса не используется, и говорит, что вы истекли/недействительны перед запуском.

дополнительное примечание: с curl или в вашем браузере, если вы выполняете команду POST, вы можете вставлять sid в контейнер .NET cookie, а вторая команда будет работать. Но выполнение первой команды (данные POST) не будет работать. Эта функция сообщения, которую я использовал для многих других сайтов, которые требуют сообщения, и пока это сработало. Очевидно, проверка метода - это большая сделка, и я вижу, что это действительно POST при выполнении первой команды.

static void Main(string[] args) 
    { 
     var cookie = new CookieContainer(); 
     PostData("http://uploading.com/files/get/37e36ed8/", "action=second_page&file_id=9134949&code=37e36ed8", cookie); 
     Thread.Sleep(4000); 
     var res = PostData("http://uploading.com/files/get/?JsHttpRequest=12719362769080-xml&action=get_link&file_id=9134949&code=37e36ed8&pass=undefined", 
      null/*this makes it GET*/, cookie); 

     Console.WriteLine(res); 
     /* 
     curl -b "SID=37468830" -A "DUMMY_User_Aggent" -d "action=second_page&file_id=9134949&code=37e36ed8" "http://uploading.com/files/get/37e36ed8/" 
     curl -b "SID=37468830" -A "DUMMY_User_Aggent" "http://uploading.com/files/get/?JsHttpRequest=12719362769080-xml&action=get_link&file_id=9134949&code=37e36ed8&pass=undefined" 
     */ 
    } 

Я сыт по горло клиентами HttpWebRequest/.NET htto. Я сделал это с помощью curl (узнав, как настроить его на .NET и обновить). Я делал это просто и быстро, и он работал. Нет глупых проблем.

 Curl.GlobalInit((int)CURLinitFlag.CURL_GLOBAL_ALL); 
     var curl = new Easy(); 
     curl.SetOpt(CURLoption.CURLOPT_USERAGENT, "DUMMY_User_Aggent"); 
     curl.SetOpt(CURLoption.CURLOPT_COOKIE, "SID=4385743"); 


     curl.SetOpt(CURLoption.CURLOPT_POSTFIELDS, "action=second_page&file_id=9134949&code=37e36ed8"); 
     curl.SetOpt(CURLoption.CURLOPT_URL, "http://uploading.com/files/get/37e36ed8/"); 
     curl.Perform(); 


     curl.SetOpt(CURLoption.CURLOPT_POST, 0); 
     Easy.WriteFunction wf = new Easy.WriteFunction(OnWriteData); 
     curl.SetOpt(CURLoption.CURLOPT_WRITEFUNCTION, wf); 
     curl.SetOpt(CURLoption.CURLOPT_URL, "http://uploading.com/files/get/?JsHttpRequest=12719362769080-xml&action=get_link&file_id=9134949&code=37e36ed8&pass=undefined"); 
     curl.Perform(); 

     curl.Cleanup(); 
     Curl.GlobalCleanup(); 
+0

Пробовал ли вы отправить запрос с обоими на свой сервер и распечатать результаты/используя что-то вроде wirehark/ethereal/network analyzer? – tstenner

+0

Мне любопытно, что нужно 4-секундная задержка, и если это может вызвать проблему. – NebuSoft

+0

@tstenner: Я провел его через фиктивную страницу, которая выводит заголовок. Я замечаю 2 вещи, длина контента +1 с CURL (я предполагаю, что она включает в себя null), и пользовательский агент не появляется даже после того, как я его установил. Thats большой WTF – user261192

ответ

0

Попробуйте использовать класс WebClient.

Это сделает ваш код МНОГО короче, тоже.

+0

Как установить данные POST и файлы cookie? – user261192

+0

POST автоматически выполняется всеми способами Upload *, такими как UploadString («http://uploading.com/files/get/37e36ed8/», «action = second_page & file_id = 9134949 & code = 37e36ed8») – Foxfire

+0

Это довольно хорошо. Могу ли я установить файлы cookie? bc мне нужно, чтобы в обеих функциях. Если бы я мог всегда использовать это. – user261192

0

Очевидно, вы пытаетесь загрузить что-то из uploading.com с помощью программы, к которой они не хотят.
Поскольку вы не отправляете UserAgent с cUrl, у них нет возможности узнать, что вы его автоматизируете, но .NET, вероятно, отправит черный пользователь UserAgent.

+0

Я исправил проблему с пользовательским агентом. Если они не хотят, чтобы я загружался с проблемой, тогда они, скорее всего, будут черным списком, который они не сделали. – user261192

+0

Также я попробовал -A "", поэтому агент не используется. Это сработало. Итак, что дает. – user261192