HttpWebRequest a zachowanie SESJI

0

Hej,
Konstruuje pewna aplikacje, ktorej zadaniem jest najpierw polaczyc sie z serwerem www po czym za pomoca odpowiednich danych POST zalogowac sie do serwisu otrzymujac ciasteczka i jakis idsesji. Niby prosta sprawa, ale jadnak HttpWebRequest za kazdym razem (nowy url/zadanie - ale ten sam serwis) tworzy nowa instancje/polaczenie. Cookie moge pobrac, w odpowiedzi otrzymuje nawet zawartosc strony po zalogowaniu.

Zalezy mi na tym aby sesja byla utrzymana i zeby przy nastepmym zapytaniu GET byc traktowany jako zalogowany :) Gdyby to bylo tylko na cookie to male piwo, ale niestety jest na sesji.

Pytanie : czy da sie to jakos zorganizowac przy pomocy HttpWebRequest (aby utrzymywala polaczenie) lub innej funkcji? W ostatecznosci bede zmuszony uzywac Gniazd :/

Pozdrawiam, dzieki za odp ;-)

0

Identyfikator sesji jest przechowywany w cookie. Przy kolejnych połączeniach musisz wysyłać cookie otrzymane w poprzednim.

0

Szybka odp. - dzieki. Jednak caly obiekt CookieContainer uzyskany z pierwszego polaczenia (zawiera 1 ciasteczko) jest uzyty przy drugim polaczeniu... jakies inne sugestie ?

0

Wklej kod jakiego używasz.

0

Pierwsze polaczenie :

            String POSTvalues = ""; // nie pokaze :)
            cookies = new CookieContainer();

            request = (HttpWebRequest)WebRequest.Create("http://"+eHost.Text+"/index.php");
            request.KeepAlive = true;
            request.CookieContainer=cookies;
            request.Method = WebRequestMethods.Http.Post;
            request.ContentType = "application/x-www-form-urlencoded";
            request.ContentLength = POSTvalues.Length + connParam.Length + uagentParam.Length + 6; //+2 bo 2 znaki konca linii

            requestStream = new StreamWriter(request.GetRequestStream());
            try
            {
                requestStream.WriteLine(POSTvalues);
                requestStream.WriteLine(uagentParam);
                requestStream.WriteLine(connParam);
                requestStream.Flush();
            }
            
            catch (WebException we) { MessageBox.Show(" ERROR : " + we.Message); }

            response = (HttpWebResponse)request.GetResponse();
            responseStream = new StreamReader(response.GetResponseStream());

            while (!responseStream.EndOfStream) {
                eData.AppendText(responseStream.ReadLine()+"\n");
            }

A oto chec nowego requesta przy zachowaniu statusu zalogowania, ktora poprzednia czesc realizuje :

request = (HttpWebRequest)WebRequest.Create("http://" + eHost.Text + "/index2.php");
            request.Method = WebRequestMethods.Http.Get;
            request.ContentType = "Content-Type: text/html; charset=UTF-8";
            
            response = (HttpWebResponse)request.GetResponse();
            responseStream = new StreamReader(response.GetResponseStream());

            while (!responseStream.EndOfStream)
            {
                eData.AppendText(responseStream.ReadLine() + "\n");
            }

Przy czym w calej klasie okna zmienne ktorych uzywam sa "globalne" dla obu metod (zwiazanych z dwoma buttonami) :

  
        private HttpWebRequest request;
        private CookieContainer cookies;
        private StreamWriter requestStream;
        private HttpWebResponse response;
        private StreamReader responseStream;
        private const string connParam = "Connection: keep-alive";
        private const string uagentParam = "User-Agent: Mozilla/5.0 (Windows; U; Windows NT 6.0; pl; rv:1.8.1.4) Gecko/20070515 Firefox/2.0.0.4";

No i jak juz pisalem przy drugim zadaniu GET/POST jestem traktowany jako niezalogowany...

0

Gdzie przy drugim odwolaniu wysylasz cookie, zeby serwer wiedzial o zalogowaniu?

0

Obiekt request i cookies nie sa kasowane po pierwszym uzyciu. Z reszta dodanie w drugim odwolaniu ponownie :

request.CookieContainer = cookies;

nic nie zmienia :/ Sesja to jest kwestia tylko nagłówków ? Jesli tak to daloby rade to obejsc.

0

Nie sa kasowane, ale obiekt request powstaje po raz drugi -> WebRequest.Create tworzy nowy obiekt, ktory nic nie wie o twoim CookieContainer.

0

Problem tkwil gdzieindziej - za kazdym przeladowaniem strony w ciastku zmienia sie element Path. Ponizszy sposob przekazywania ciastek dziala :) [browar] [diabel]

cookies2.SetCookies(url2, cookies.GetCookieHeader(url));

Dzieki wszystkim za pomoc.

0

Wiesz co, mam ten sam problem, jak go dokładnie rozwiazałeś, skorzystałem z twojego kodu, ale nie mogę przesłać danych metodą get, a jak używam metody post, to tylko pierwsza strona po logowaniu się otwiera (jest w niej dodatkowy fragment "&lgn=1" w adresie, a pozostałe automatycznie mnie wylogowują, nie mogę dodać tego fragmentu do innych stron. Co mam zrobić?

Używam takiego kodu:

HttpWebRequest logowanie= null;
		HttpWebRequest strona = null;
		CookieContainer cookies = new CookieContainer();
		bool ready =false;
		
		private string connParam = "Connection: keep-alive";
        private string uagentParam = "User-Agent: Mozilla/5.0 (Windows; U; Windows NT 6.0; pl; rv:1.8.1.4) Gecko/20070515 Firefox/2.0.0.4";
			
		String adres = "";
		String sesja = "";
public void Login(String server, String login, String haslo){
			ready=false;
			
			String PostValues = "button=login&v=2&login="+login+"&pass="+haslo+"&universe=s"+server+".ogame.onet.pl";
			Console.WriteLine(">>>>>LOGOWANIE<<<<<"); // logowanie
			adres="http://s"+server+".ogame.onet.pl";
			logowanie =(HttpWebRequest)WebRequest.Create(adres+"/game/reg/login2.php");
			logowanie.KeepAlive=true;
			logowanie.Method= WebRequestMethods.Http.Post;
			logowanie.ContentType = "application/x-www-form-urlencoded";
			logowanie.ContentLength = PostValues.Length+connParam.Length+uagentParam.Length+6;
			logowanie.CookieContainer= cookies;
			
			StreamWriter requestStream = new StreamWriter(logowanie.GetRequestStream());
			
			try{
				requestStream.WriteLine(PostValues);
				requestStream.WriteLine(uagentParam);
                requestStream.WriteLine(connParam);
				requestStream.Flush();
				
			}catch(Exception ex){
				Console.WriteLine(ex);
			}
			
			try{
				HttpWebResponse odpowiedz = (HttpWebResponse)logowanie.GetResponse();
				
				StreamReader responseStream = new StreamReader(odpowiedz.GetResponseStream());
	
				String respStr = responseStream.ReadLine();
				
				if(!responseStream.EndOfStream){
					Console.WriteLine(">>>>>ERROR<<<<<");
					Console.WriteLine(respStr);
            		while (!responseStream.EndOfStream) {
            	    	Console.WriteLine(responseStream.ReadLine()+"\n");
            		}
				}else{
					Console.WriteLine(">>>>>ZALOGOWANO<<<<<");
					Console.WriteLine(respStr);
					int sessPos = respStr.IndexOf("session");
					int sessPosA =respStr.IndexOf("=",sessPos);
					int sessPosB =respStr.IndexOf("&",sessPos);
					sesja = respStr.Substring(sessPosA+1, sessPosB-sessPosA-1);
					Console.WriteLine(">>>>>SESJA:"+sesja+"<<<<<");
					
					ready=true;
				}
			}catch(Exception ex){
				Console.WriteLine(ex);
			}
			
			//Console.WriteLine(">>>"+cookies.GetCookieHeader(new Uri(adres)));
			//cookies.SetCookies(new Uri(adres), cookies.GetCookieHeader(new Uri(adres+"/game/reg/login2.php")));

			Open("page=overview&lgn=1");
			
			//Console.WriteLine(">>>"+cookies.GetCookieHeader(new Uri(adres+"/game/reg/login2.php")));
			
		}

public StreamReader OpenStreamReader(String command){
			String PostValues = "session="+sesja+"&"+command;
			
			strona = (HttpWebRequest)WebRequest.Create(adres + "/game/index.php");
			strona.Method = WebRequestMethods.Http.Post;
			strona.ContentType = "application/x-www-form-urlencoded";
			strona.ContentLength = PostValues.Length+connParam.Length+uagentParam.Length+6;
			strona.CookieContainer= cookies;
			
			Console.WriteLine(">>>>>STRONA<<<<<");
			Console.WriteLine(">>>>>KOMENDA:"+command+"<<<<<");
			
			
			
			
			try{
				
				StreamWriter requestStream = new StreamWriter(strona.GetRequestStream());
				
				requestStream.WriteLine(PostValues);
				requestStream.WriteLine(uagentParam);
                requestStream.WriteLine(connParam);
				requestStream.Flush();
				
			}catch(Exception ex){
				Console.WriteLine(ex);
			}
			
			try{
				HttpWebResponse odpowiedz = (HttpWebResponse)strona.GetResponse();
			
				StreamReader responseStream = new StreamReader(odpowiedz.GetResponseStream());
	
				Console.WriteLine(">>>>>STRUMIEŃ GOTOWY<<<<<");
				return responseStream;
				
			}catch(Exception ex){
				return null;
			}
				
				
		}

public String Open(String command){
			
			StreamReader responseStream = OpenStreamReader(command);
			String data = responseStream.ReadToEnd();

			Console.WriteLine(">>>>>WCZYTANO<<<<<");
			return data;	
			
			
				
				
				
		}
0

Ok, znalazłem sposób:

strona.ContentLength = 0;
strona = (HttpWebRequest)WebRequest.Create(adres + "/game/index.php?"+PostValues);
strona.Method = WebRequestMethods.Http.Get;

1 użytkowników online, w tym zalogowanych: 0, gości: 1