Laden...

Fehler beim HTTPWebRequest

Erstellt von Inuyasha2004 vor 12 Jahren Letzter Beitrag vor 12 Jahren 2.075 Views
I
Inuyasha2004 Themenstarter:in
38 Beiträge seit 2008
vor 12 Jahren
Fehler beim HTTPWebRequest

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

2.891 Beiträge seit 2004
vor 12 Jahren

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.

I
Inuyasha2004 Themenstarter:in
38 Beiträge seit 2008
vor 12 Jahren

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();

2.891 Beiträge seit 2004
vor 12 Jahren

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).

I
Inuyasha2004 Themenstarter:in
38 Beiträge seit 2008
vor 12 Jahren

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).

2.891 Beiträge seit 2004
vor 12 Jahren

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?

B
387 Beiträge seit 2005
vor 12 Jahren

Hi,

eventuell wird ja eine eigene Session-Variable oder sowas zurückgeliefert. Schau dir mal per Fiddler an, was du dem Dienst beim Einloggen sendest und was du zurück bekommst.

Hier findest du den Download:
Fiddler

Gruß
Roland

I
Inuyasha2004 Themenstarter:in
38 Beiträge seit 2008
vor 12 Jahren

Haha oh man, danke dN!3L!

Der Header hat unten gefehlt ;D

Danke auch an die anderen ^^

Grüße Inu