2010-05-20 14 views
5

Я пытаюсь войти в веб-приложение из своего .net-приложения, но по какой-то причине он не работает. Вот код Логин:HttpWebResponse login

<form action="./process-login.php" method="post"> 
     <table border="0" cellpadding="5" cellspacing="0"> 
     <tr> 
      <td>Username:</td> 
      <td><input type="text" size="20" name="username" value=""></td> 
     </tr> 
     <tr> 
      <td>Password:</td> 
      <td><input type="password" size="20" name="password" value=""></td> 
     </tr> 
     <tr> 
      <td><input type="submit" name="axn" value=Login></td> 
     </tr> 
     </table> 
</form> 

Вот как я это делаю из .net:

string userName = "user"; 
string password = "password"; 

string postData = "username=" + userName; 
      postData += ("&password=" + password); 
      postData += ("&axn=Login"); 

HttpWebRequest loginRequest = (HttpWebRequest) 
       WebRequest.Create("http://server.com/process-login.php"); 

//Added following answer begin 
CookieContainer CC = new CookieContainer(); 
loginRequest.CookieContainer = CC; 
//Added following answer end 

loginRequest.Method = "POST"; 
loginRequest.Accept = "image/gif, image/jpeg, image/pjpeg, image/pjpeg, application/x-shockwave-flash, application/vnd.ms-excel, application/vnd.ms-powerpoint, application/msword, application/x-ms-application, application/x-ms-xbap, application/vnd.ms-xpsdocument, application/xaml+xml, */*"; 
loginRequest.Headers.Add("Accept-Encoding: gzip,deflate"); 
loginRequest.Headers.Add("Accept-Language: en-us"); 
loginRequest.UserAgent = "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; .NET CLR 1.0.3705;)"; 

loginRequest.ContentLength = postData.Length; 
loginRequest.ContentType = "application/x-www-form-urlencoded"; 

loginRequest.Referer = "http://server.com/login.php"; 
loginRequest.KeepAlive = true; 

//Also added 
loginRequest.AllowAutoRedirect = false; 

StreamWriter newStream = new StreamWriter(loginRequest.GetRequestStream()); 
newStream.Write(postData); 
newStream.Close(); 

//No cookie in the collection :-(

//Problem here, after this line loginRequest url's has changed 
//it's gone back to login.php 
HttpWebResponse responseLogin = (HttpWebResponse)loginRequest.GetResponse(); 


StreamReader stIn = new StreamReader(responseLogin.GetResponseStream()); 
string strResponse = stIn.ReadToEnd(); 
stIn.Close(); 

//strResponde contains the login page, still no cookie :-(

я войти в систему, используя свой браузер и проверить с стельку это то, что я получаю для клиента:

POST http://server.com/process-login.php HTTP/1.1 
Accept: image/gif, image/jpeg, image/pjpeg, image/pjpeg, application/x-shockwave-flash, application/vnd.ms-excel, application/vnd.ms-powerpoint, application/msword, application/x-ms-application, application/x-ms-xbap, application/vnd.ms-xpsdocument, application/xaml+xml, */* 
Referer: http://server.com/login.php 
Accept-Language: en-us 
User-Agent: Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.2; WOW64; Trident/4.0; .NET CLR 2.0.50727; InfoPath.2; .NET CLR 3.0.4506.2152; .NET CLR 3.5.30729) 
Content-Type: application/x-www-form-urlencoded 
Accept-Encoding: gzip, deflate 
Host: server.com 
Content-Length: 45 
Connection: Keep-Alive 
Pragma: no-cache 

username=username&password=password&axn=Login 

И в заголовках ответа я получаю:

HTTP/1.1 302 Found 
Date: Thu, 20 May 2010 14:07:36 GMT 
Server: Apache/2.2.3 (Unix) 
Accept-Ranges: bytes 
X-Powered-By: PHP/5.2.0 
Set-Cookie: login=User%7C3142%7CUser+Inc.%7CAll+Orders+Discounted%7C; expires=Thu, 20-May-2010 22:07:36 GMT; domain=server.com 
Set-Cookie: username=deleted; expires=Wed, 20-May-2009 14:07:35 GMT; path=/; domain=server.com 
Set-Cookie: password=deleted; expires=Wed, 20-May-2009 14:07:35 GMT; path=/; domain=server.com 
Location: /index.php 
Content-Length: 0 
Keep-Alive: timeout=15, max=200 
Connection: Keep-Alive 
Content-Type: text/html 

The cookie !!!

Что я делаю неправильно, что не могу получить куки?

ОБНОВЛЕНИЕ: Добавление следующего кода: теперь я могу получить файл cookie! Я открою еще один вопрос, потому что кажется, что я все еще не могу получить защищенные страницы ...

ответ

5

Я не вижу, как вы устанавливаете CookieContainer на веб-ресурс. Можете ли вы повторить попытку, установив это?

+0

Вы правы, я инициализировал CookieContainer, и теперь он действительно заполняется! – Enriquev

1

С момента получения 302 веб-запрос автоматически запрашивает следующий URL-адрес. Вы можете отключить это, установив loginRequest.AllowAutoRedirect = false;. После этого вы увидите файлы cookie. Here's the documentation for AllowAutoRedrect.

+0

Здравствуйте, я добавил loginRequest.AllowAutoRedirect = false; после loginRequest.KeepAlive = true; Теперь страница не меняется, но коллекция файлов cookie по-прежнему пуста ... – Enriquev

Смежные вопросы