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;    

        }

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