Forum: PC-Programmierung Error Code 401 through C# API


von Torben (Gast)


Lesenswert?

Hallo, ich hab ein merkwürdigen Fehler und weiß nicht woran es liegen 
kann, weil es nicht mein Spezialgebiet ist.

Beschreibung:

Wir haben einen Webserver im Internet, welches eine WebApplikation(html, 
java, php) im Explorer darstellt und im Hintergrund werkelt eine 
Datenbank auf dem Internetserver. Die Seite ist gestützt mit einem 
Usernamen und Passwort mit HTTPS (SSL?). Die Webapplikation bietet auch 
eine REST API an, damit man ohne Explorer auf die Daten der MySQL 
Datenbank zugreifen kann.

Ich kann ohne Probleme mittels Explorer mit den Daten auf der Webpage 
arbeiten und auch mein C# Programm kann mittels REST API darauf 
zugreifen.


Problem:

Wenn ich längere Zeit nicht mit dem Explorer auf die Seite zugreife und 
dann mittels REST API und C# Datenabrufen will krieg ich ein Fehlercode 
401 zurück.

Verbinde ich mich mit dem Explorer auf die Seite, dann kann ich eine 
gewisse Zeit mittels REST API Daten abrufen. Nach einiger Zeit ohne den 
Explorer genutzt zu haben (z.b. Refreshpage) bekomme ich wieder die 
Fehlermeldung 401 mit der REST API.

Ich übergebe der API jedes mal den Usernamen und Passwort, trotzdem 
ergibt sich das beschriebene Fehlerbild.

Der Fehlercode 401 bedeutet: 401 Unauthorized Error


Ich hoffe jemand kann mir ein Tipps zur Fehlersuche geben.

von Jonas B. (jibi)


Lesenswert?

Was für einen Restclient benutzt du zum Datenabfragen? Da kann man 
normalerweise eine Authentifizierung zum Request hinzufügen...
Ich kann die restlet für chrome empfehlen...

von Torben (Gast)


Lesenswert?

Hallo,

als RestClient benutze ich ein Nuget Package (hier der Github Link), 
weil ich automatisiert auf die Daten zugreifen muss und nicht über die 
Webpage.

Ich hab mir Fiddler installiert, damit ich die Unterschiede zwischen 
Internet Explorer und dem C# Restclient sehen kann.

Was mir Kopfschmerzen macht ist, dass es nach einem Zugriff mit dem 
Internet Explorer, Chrome und Mozilla nur einige Zeit mittels dem C# 
RestClient funktioniert. Mit Internet Explorer, Chrome und Mozilla krieg 
ich nie einen Fehler 401.

von Torben (Gast)


Lesenswert?


von Jonas B. (jibi)


Lesenswert?

>als RestClient benutze ich ein Nuget Package (hier der Github Link),
>weil ich automatisiert auf die Daten zugreifen muss und nicht über die
>Webpage.

Schon klar, Rest ist ja auch nicht für "Menschen" gedacht.
Was für ein Link? ein restclient hilft dir bei der analyse..., da er die 
response aufbereitet für dich. ich wiederhohle mich gerne. use chrome + 
restlet client.

>Ich hab mir Fiddler installiert, damit ich die Unterschiede zwischen
>Internet Explorer und dem C# Restclient sehen kann.

Don't use this shit!
chrome oder firefox ist standard...
internet explorer benutzen nur behörden die von active-x nicht 
wegkommen.

Zeug mal den kompletten Code her!

von Torben (Gast)


Lesenswert?

Hallo,
1
 TestRailClient client = new TestRailClient("die url zum server e.g. https://xyz.azurewebsites.net", username, password);
2
            client.OnOperationFailed += (sender, s) => Console.WriteLine(s);
3
            client.OnHTTPRequestSent += (sender, s) => Console.WriteLine(s);
4
            client.OnHTTPResponseReceived += (sender, s) => Console.WriteLine(s);

Wenn ich nun im Github code von hier 
https://github.com/zoosk/testrail-client/blob/master/TestRail/TestRailClient.cs 
schaue, dann ist sicherlich der Part interessant.
1
private CommandResult _CallTestRailGetEndpoint(string uri)
2
        {
3
            uri = _URL_ + uri;
4
            OnHTTPRequestSent(this, new HTTPRequestSentEventArgs("GET", new Uri(uri)));
5
            CommandResult cr;
6
            try
7
            {
8
                var request = (HttpWebRequest)WebRequest.Create(uri);
9
                request.AllowAutoRedirect = true;
10
                var authInfo = Convert.ToBase64String(Encoding.Default.GetBytes($"{_UserName_}:{_Password_}"));
11
                request.Headers["Authorization"] = $"Basic {authInfo}";
12
                request.UserAgent = "TestRail Client for .NET";
13
                request.Method = "GET";
14
                request.Accept = "application/json";
15
                request.ContentType = "application/json";
16
17
                // receive the response
18
                var response = (HttpWebResponse)request.GetResponse();
19
                var responseDataStream = response.GetResponseStream();
20
                var reader = new StreamReader(responseDataStream);
21
                var responseFromServer = reader.ReadToEnd();
22
                cr = new CommandResult(response.StatusCode == HttpStatusCode.OK, responseFromServer);
23
                reader.Close();
24
                response.Close();
25
            }
26
            catch (Exception e) { cr = new CommandResult(false, e.ToString()); }
27
            if (!cr.WasSuccessful)
28
            {
29
                OnOperationFailed(this, $"HTTP RESPONSE: {cr.Value}");
30
            }
31
            else
32
            {
33
                OnHTTPResponseReceived(this, cr.Value);
34
            }
35
            return cr;
36
        }

von Jonas B. (jibi)


Lesenswert?

Encoding mal auf UTF-8 und mal POST als Methode probieren...

von Torben (Gast)


Lesenswert?

Ok, danke. Ich werd mal chrome + reslet benutzen und mir die 
Unterschiede anschauen beim Auth etc. anschauen.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.