HTTP & Cookies
-
Hallo,
ich bin gerade dabei eine Anwendung die ich in C++ schon mal realisiert habe zum Einsteig in C# nachzuprogrammieren.
Mein Programm soll sich auf einer Seite im Internet einloggen und dann ein paar Seiten automatisch auslesen.
Das Einloggen funktioniert auch wunderbar, wenn ich jedoch einen weiteren Zugriff auf die Seite mache, sehe ich beim debuggen wunderbar, dass ich nicht mehr eingeloggt bin.
Die Seite setzt Cookies voraus.
Ich benutze folgenden Code um auf die Seite zuzugreifen :public String GetAnswer(String url) { WebRequest webreq = WebRequest.Create(url); WebResponse webres = webreq.GetResponse(); Stream webstream = webres.GetResponseStream(); Encoding encode = System.Text.Encoding.GetEncoding("utf-8"); StreamReader readstream = new StreamReader(webstream, encode); char[] buffer = new char[1025]; int n = readstream.Read(buffer, 0, 1024); String answer = new String(buffer, 0, 1024); while (n > 0) { n = readstream.Read(buffer, 0, 1024); String ans = new String(buffer, 0, n); answer += ans; } webstream.Close(); return answer; }
in C++ hatte ich folgenden Code gehabt :
CString CGetPage::GetIt() { CString erg; CInternetSession session("Meine Sitzung"); CHttpConnection* pServer = NULL; CHttpFile* pFile = NULL; CString strServerName=m_server+CString(".irgendeineseite.de"); CString strPage=m_adress; INTERNET_PORT nPort=80; DWORD dwRet; try { pServer = session.GetHttpConnection(strServerName); pFile = pServer->OpenRequest(CHttpConnection::HTTP_VERB_GET, strPage); pFile->SendRequest(); pFile->QueryInfoStatusCode(dwRet); if (dwRet == HTTP_STATUS_OK) { char szBuff[10240]; UINT nRead = pFile->Read(szBuff, 10239); while (nRead==10239) { erg+=szBuff; nRead = pFile->Read(szBuff, 10239); } erg+=szBuff; } } catch (CInternetException* pEx) { ... } delete pFile; delete pServer; session.Close(); return erg; }
Kann mir da jemand helfen ?
-
Hallo,
dank Google habe ich doch noch eine Lösung für mein Problem gefunden :
http://www.developerfusion.com/show/4637/3/Einfach vor dem Login die CookieCollection initialisieren, nach dem Login diese aus dem HttpWebResponse in einen eigenen CookieContainer kopieren und später bei jedem Zugriff alle Cookies dem HttpWebRequest wieder beigeben.
public class MyHTTPRequest { private CookieCollection Cookies; public MyHTTPRequest() { Cookies = new CookieCollection(); } public String GetAnswer(String url) { HttpWebRequest webreq = (HttpWebRequest)WebRequest.Create(url); webreq.CookieContainer = new CookieContainer(); foreach (Cookie sCookie in Cookies) webreq.CookieContainer.Add(sCookie); WebResponse webres = webreq.GetResponse(); Stream webstream = webres.GetResponseStream(); Encoding encode = System.Text.Encoding.GetEncoding("utf-8"); StreamReader readstream = new StreamReader(webstream, encode); char[] buffer = new char[1025]; int n = readstream.Read(buffer, 0, 1024); String answer = new String(buffer, 0, 1024); while (n > 0) { n = readstream.Read(buffer, 0, 1024); String ans = new String(buffer, 0, n); answer += ans; } webstream.Close(); return answer; } public String Login(String url) { Cookies = new CookieCollection(); HttpWebRequest webreq = (HttpWebRequest)WebRequest.Create(url); webreq.CookieContainer = new CookieContainer(); HttpWebResponse webres = (HttpWebResponse)webreq.GetResponse(); Stream webstream = webres.GetResponseStream(); Encoding encode = System.Text.Encoding.GetEncoding("utf-8"); StreamReader readstream = new StreamReader(webstream, encode); char[] buffer = new char[1025]; int n = readstream.Read(buffer, 0, 1024); String answer = new String(buffer, 0, 1024); while (n > 0) { n = readstream.Read(buffer, 0, 1024); String ans = new String(buffer, 0, n); answer += ans; } if (webres.Cookies.Count > 0) { Cookies = webres.Cookies; } webstream.Close(); return answer; } }