Som jag skrev i ett annat inlägg så försöker jag göra ett program som klarar av att logga in på en hemsida. Hemsidan använder sig av sessions för att kontrollera att man är inloggad. Problemet ligger i att programmet inte letar rätt på sessioncookien på min hdd så jag "loggas ut" direkt, eftersom servern inte hittar kakan. Du får nog visa lite kod hur du skapar och söker efter kakan så kanske vi kan se vad som är fel. Du har en session state men letar efter en cookie? Hum, får det inte att gå ihop. Pelle, det är just det jag inte har. Eftersom jag inte har en aning på hur jag ska göra eller hur saker och ting igentligen fungerar bakom kuliserna. Antar att jag måste börja i den änden. Så här gör du. Jag har med er hjälp nu lyckats arbeta fram den här koden: En timme till i SDK gjorde susen, nu löste det sig. Vad jag gjorde var att skapa en CookieContainer för att sedan Adda myCookie.Hitta sessioncookien
Någon som vet hur man löser detta eller har sett ett progam på nätet?Sv: Hitta sessioncookien
Sv: Hitta sessioncookien
Sessionen ligger på Serverns minne så på din klient finns egentligen inte en cookie (förutom en som talar om sessionsId:t om jag inte ärute o cyklar)
så du får gärna förklara dig igen.
//Johan NSv: Hitta sessioncookien
Kan ju förklara lite mer ingående vad själva iden med programmet går ut på, då kanske det blir lättarte att förstå.
I en vanlig webbläsare så funkar det på det här viset:
1. Man skriver in använarnamn och lösenord
2. Servern kontrolerar om använarnamn och lösenord stämmer
3. Man får en cookie med sessions idet
4. Man surfar vidare på sidan
I programmet
1. Programmet skickar automatisk användarnamn och lösenord till servern
2. Servern kontrolerar om använarnamn och lösenord stämmer
3. Man får en cookie med sessions idet
4. Man kan surfa vidare genom prgrammet
Programmet ska alltså fungera lite som en webbläsare. En webbläsare håller ju koll på sessions kakan som skapas, det gör inte mitt program, där ligger felet. Och det är själva sättet man kan lösa detta på. Jag tror inte någon kod skulle komma till någon hjälp eftersom inget är direkt fel, bara funktionen som saknas.
En tanke som slog mig medans jag skrev detta var att sessions idet ska skickas med när man försöker hämta sidan. Kan det vara rätt gissat?
Kod för att hämta en sida
<code>
private string GetHtml(string strSite)
{
string strText = "";
HttpWebRequest myRequest = (HttpWebRequest)WebRequest.Create(strSite);
myRequest.UserAgent = "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1)";
HttpWebResponse myResponse = (HttpWebResponse)myRequest.GetResponse();
StreamReader myStreamReader = new StreamReader(myResponse.GetResponseStream(), Encoding.ASCII);
strText = myStreamReader.ReadToEnd();
myStreamReader.Close();
myResponse.Close();
return strText;
}
</code>Sv: Hitta sessioncookien
Du skickar loginuppgifter till sidan, och plockar tillbaka returströmmen. I dennä
header har du Sessionsid:t. Du plockar ut den och skickar med den i alla dina framtida get eller postas.
Ex när du kommer till en sida får du ett huvd som ser ut så här:
<code>
HTTP/1.1 200 OK
Server: Microsoft-IIS/5.0
Date: Mon, 01 Sep 2003 22:17:11 GMT
Set-Cookie: ASP.NET_SessionId=dpz0j445mwvw1a55xgl4xh55; path=/
Cache-Control: private
Content-Type: text/html; charset=iso-8859-1
Content-Length: 10669
</code>
Här har du "ASP.NET_SessionId=dpz0j445mwvw1a55xgl4xh55;"
Detta ID skickar du sedan med i alla dina Get eller Post ex:
<code>
GET foo.aspx HTTP/1.1
Accept: */*
Referer: http://www.Foo.com/index.htm
Accept-Language: en-us
Accept-Encoding: gzip, deflate
User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.2; .NET CLR 1.1.4322)
Host: www.Foo.com
Connection: Keep-Alive
Cookie: ASP.NET_SessionId=dpz0j445mwvw1a55xgl4xh55;
</code>
//Johan NSv: Hitta sessioncookien
<code>
CookieCollection myCookie = null;
private string GetHtml(string strSite)
{
string strText = "";
HttpWebRequest myRequest = (HttpWebRequest)WebRequest.Create(strSite);
myRequest.UserAgent = "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1)";
myRequest.CookieContainer = myCookie; //Gillar inte få en CookieCollection
strText = myRequest.Headers.ToString();
HttpWebResponse myResponse = (HttpWebResponse)myRequest.GetResponse();
StreamReader myStreamReader = new StreamReader(myResponse.GetResponseStream(), Encoding.ASCII);
//strText = myStreamReader.ReadToEnd();
myStreamReader.Close();
myResponse.Close();
return strText;
}
private void Login()
{
string strInfo = "Username=****&Password=****";
ASCIIEncoding encoding = new ASCIIEncoding();
byte[] SomeBytes = encoding.GetBytes(strInfo);
Market myMarket = new Market();
Console.WriteLine("Not logged in, wait...");
try
{
HttpWebRequest myRequest = (HttpWebRequest)WebRequest.Create("http://www.ensida.nu");
myRequest.UserAgent = "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1)";
myRequest.ContentLength = SomeBytes.Length;
myRequest.Method = "POST";
myRequest.Timeout = 10000;
myRequest.AllowWriteStreamBuffering = true;
myRequest.CookieContainer = new CookieContainer();
myRequest.ContentType = "application/x-www-form-urlencoded";
StreamWriter myStream = new StreamWriter(myRequest.GetRequestStream());
myStream.Write(strInfo);
myStream.Close();
HttpWebResponse myResponse = (HttpWebResponse)myRequest.GetResponse();
myCookie = myResponse.Cookies; //Cookien sparas som CookieCollection
Console.WriteLine("Logged in!");
myResponse.Close();
}
catch (Exception ex)
{
Console.WriteLine(ex);
}
}
</code>
Det blir ngn konflikt mellan CookieContainer och CookieCollection, Vad ska jag göra åt det problemet? Om jag är ens är rätt ute dvs.Sv: Hitta sessioncookien
<code>
private string GetHtml(string strSite)
{
string strText = "";
CookieContainer myCookieContainer = new CookieContainer();
myCookieContainer.Add(myCookie);
HttpWebRequest myRequest = (HttpWebRequest)WebRequest.Create(strSite);
myRequest.UserAgent = "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1)";
myRequest.CookieContainer = myCookieContainer;
HttpWebResponse myResponse = (HttpWebResponse)myRequest.GetResponse();
StreamReader myStreamReader = new StreamReader(myResponse.GetResponseStream(), Encoding.ASCII);
strText = myStreamReader.ReadToEnd();
myStreamReader.Close();
myResponse.Close();
return strText;
}
</code>
Tack för all hjälp!