Hallo zusammen,
ich komm grad nicht weiter, mach schon seit einigen Tagen daran rum.
Und zwar möchte ich mich mit HTTP Request auf das Webinterface von nem Drucker connecten (Punkt 1 - Überwindung der Authentifizierung) und danach HTTP Requests mit POST Daten an ihn senden (eingelogg).
Das hier ist mein Code:
string url = "https://bla_blub.com/hp/device/this.LCDispatcher?nav=hp.DeviceStatus&action=doLogin";
HttpWebRequest myReq = (HttpWebRequest)HttpWebRequest.Create(url);
string username = "admin";
string password = "password";
string usernamePassword = username + ":" + password;
NetworkCredential cred = new NetworkCredential(username, password, url);
mycache = new CredentialCache();
mycache.Add(new Uri(url), "Basic", cred);
//mycache.Add(new Uri(url), "Digest", cred);
//mycache.Add(new Uri(url), "NTLM", cred);
//mycache.Add(new Uri(url), "Kerberos", cred);
myReq.Credentials = mycache;
myReq.Headers.Add("Authorization", "Basic " + Convert.ToBase64String(new ASCIIEncoding().GetBytes(usernamePassword)));
WebResponse wr = myReq.GetResponse();
Stream receiveStream = wr.GetResponseStream();
StreamReader reader = new StreamReader(receiveStream, Encoding.UTF8);
string content = reader.ReadToEnd();
// Im content wird der Link mit "ausloggen" angezeigt
// request
HttpWebRequest request = (HttpWebRequest)WebRequest.Create("https://bla_blub.com/hp/device/this.LCDispatcher?nav=hp.General");
request.KeepAlive = false;
request.ProtocolVersion = HttpVersion.Version10;
request.Method = "POST";
request.Credentials = mycache;
request.Timeout = 10000;
// byte stream
byte[] postBytes = Encoding.ASCII.GetBytes(post);
// content
request.ContentType = "application/x-www-form-urlencoded";
request.ContentLength = postBytes.Length;
Stream requestStream = request.GetRequestStream();
// senden
requestStream.Write(postBytes, 0, postBytes.Length);
requestStream.Close();
// Response
HttpWebResponse response = (HttpWebResponse)request.GetResponse();
string htmltext = new StreamReader(response.GetResponseStream()).ReadToEnd();
Bekomme leider immer die Fehlermeldung
The remote server returned an error: (401) Unauthorized.
Hoffe mir kann jemand helfen.
Danke =)
Grüße
Ich denke, du müsstest noch die Cookies vom ersten Request mit beim zweiten übertragen. Damit der Server auch beim zweiten Request "noch weiß", dass du eingeloggt bist.
Guck dir mal den WebClient mit HTTP-POST- und Cookie-Unterstützung an. Der ist für solche Szenarien gedacht.
Danke, hab ich jetzt mal versucht umzusetzen.
Bekomm nur leider keine Cookies vom Request zurück =/
string url = "https://bla_blub.com/hp/device/this.LCDispatcher?nav=hp.DeviceStatus&action=doLogin";
HttpWebRequest myReq = (HttpWebRequest)HttpWebRequest.Create(url);
CookieCollection Cookies = new CookieCollection();
myReq.CookieContainer = new CookieContainer();
string username = "admin";
string password = "password";
string usernamePassword = username + ":" + password;
NetworkCredential cred = new NetworkCredential(username, password, url);
mycache = new CredentialCache();
mycache.Add(new Uri(url), "Basic", cred);
//mycache.Add(new Uri(url), "Digest", cred);
//mycache.Add(new Uri(url), "NTLM", cred);
//mycache.Add(new Uri(url), "Kerberos", cred);
myReq.Credentials = mycache;
myReq.Headers.Add("Authorization", "Basic " + Convert.ToBase64String(new ASCIIEncoding().GetBytes(usernamePassword)));
HttpWebResponse response = (HttpWebResponse)myReq.GetResponse();
Cookies = response.Cookies;
Stream receiveStream = response.GetResponseStream();
StreamReader reader = new StreamReader(receiveStream, Encoding.UTF8);
string content = reader.ReadToEnd();
// Im content wird der Link mit "ausloggen" angezeigt
// request
HttpWebRequest request = (HttpWebRequest)WebRequest.Create("https://bla_blub.com/hp/device/this.LCDispatcher?nav=hp.General");
request.KeepAlive = false;
request.ProtocolVersion = HttpVersion.Version10;
request.Method = "POST";
request.CookieContainer.Add(Cookies);
request.Credentials = mycache;
request.Timeout = 10000;
// byte stream
byte[] postBytes = Encoding.ASCII.GetBytes(post);
// content
request.ContentType = "application/x-www-form-urlencoded";
request.ContentLength = postBytes.Length;
Stream requestStream = request.GetRequestStream();
// senden
requestStream.Write(postBytes, 0, postBytes.Length);
requestStream.Close();
// Response
HttpWebResponse response = (HttpWebResponse)request.GetResponse();
string htmltext = new StreamReader(response.GetResponseStream()).ReadToEnd();
Und das du keine Cookies bekommst, schließt du woraus?
In WebClient mit HTTP-POST- und Cookie-Unterstützung werden die Cookies noch etwas anders behandelt, da es manchmal Fälle gibt, in denen die Cookies nicht korrekt übernommen werden (wenn man die "normale" Lösung verwendet).
Hab die "Bugs" nun auch noch so behandelt wie in deinem Beispiel.
Allerdings bekomm ich immer noch keine Cookies. Wenn ich in den CookieContainer rein schau ist er leer(count = 0).
Da HTTP ja zustandslos ist, muss aber irgendwas, was die Authentifizierung garantiert bei jedem Request mitgeschickt werden. Wenn es scheinbar nicht die Cookies sind, dann
muss es etwas anderes sein.
Bei deinem Code fällt mir auf, dass du beim zweiten Request den Authorization-Header nicht auch setzt. Könnte das schon der Fehler sein?
Haha oh man, danke dN!3L!
Der Header hat unten gefehlt ;D
Danke auch an die anderen ^^
Grüße Inu