Willkommen auf myCSharp.de! Anmelden | kostenlos registrieren
 | Suche | FAQ

Hauptmenü
myCSharp.de
» Startseite
» Forum
» Suche
» Regeln
» Wie poste ich richtig?

Mitglieder
» Liste / Suche
» Wer ist online?

Ressourcen
» FAQ
» Artikel
» C#-Snippets
» Jobbörse
» Microsoft Docs

Team
» Kontakt
» Cookies
» Spenden
» Datenschutz
» Impressum

  • »
  • Community
  • |
  • Diskussionsforum
Einen GET-Request mit Bearer-Token aus C#-Anwendung (HttpWebRequest) feuern?
CrocodileDundee
myCSharp.de - Member



Dabei seit:
Beiträge: 54

Themenstarter:

Einen GET-Request mit Bearer-Token aus C#-Anwendung (HttpWebRequest) feuern?

beantworten | zitieren | melden

Hallo zusammen,
ich versuche gerade auf die Wrike-API mit einem kleinen C#-Terminal zuzugreifen. Dafür habe ich eine App registriert und einen Permanent-Token generiert.

Mit Hilfe von des Tools Postman gelingt mir nun auch der entsprechende Datenzugriff, dessen Befehl folgendermaßen aussieht:


GET /api/v4/contacts?me=true HTTP/1.1
Host: www.wrike.com
Authorization: Bearer XXXYYYZZZ
User-Agent: PostmanRuntime/7.16.3
Accept: */*
Cache-Control: no-cache
Postman-Token: ABCDEFGHIJKLM
Host: www.wrike.com
Accept-Encoding: gzip, deflate
Cookie: is_eu_visitor=1; wrikeLocale=en; wordpress_google_apps_login=bfac67bca374d2758bfe58e9d1429192; lgd=0; BCSI-CS-cc3d248abb9328f5=1
Connection: keep-alive
cache-control: no-cache


Dabei ist XXXYYYZZ der Permanent-Token, der real ca. 150 Zeichen lang ist.

Nun versuche ich diesen Befehl mittels http-Request in meinem C#-Terminal aus abzusetzen, wobei die die folgende gezeige Methode "makeRequest" meiner entsprechenden Kasse aufrufe.
Die Stelle an der dann die Ausnahme geworfen wird, habe ich unten im Code gekennzeichnet.

Die entsprechende Fehlermessage ist dann:
Fehler
"Die zugrunde liegende Verbindung wurde geschlossen: Unerwarteter Fehler beim Senden."


        // Request data from URI
        public string makeRequest()
        {
            // Declarations
            string strResponseValue = string.Empty;
            string endpoint = $"https:/www.wrike.com/api/v4/contacts?me=true";

            HttpWebRequest request = (HttpWebRequest)WebRequest.Create(endPoint);

            request.Method = "GET";

            request.Headers.Add("Authorization", "Bearer XXXYYYZZZ"); 

            HttpWebResponse response = null;

            try
            {
                response = (HttpWebResponse)request.GetResponse();

 		// ---------------------------------------------------
		// An dieser Stelle wird die Ausnahme geworfen
 		// ---------------------------------------------------
                using (Stream responseStream = response.GetResponseStream())
                {
                    if (responseStream != null)
                    {
                        using (StreamReader reader = new StreamReader(responseStream))
                        {
                            strResponseValue = reader.ReadToEnd();
                        }
                    }
                }
            }
            catch(Exception ex)
            {
                strResponseValue = "{\"errorMessages\":[\"" + ex.Message.ToString() + "\"],\"errors\":{}}"; 
            }
            finally
            {
                if(response != null)
                {
                    ((IDisposable)response).Dispose();
                }
            }
            return strResponseValue;
        }

Kann mir jemand vielleicht sagen, warum diese Anfrage nicht funtioniert?

Danke und Gruß
Frank
private Nachricht | Beiträge des Benutzers
T-Virus
myCSharp.de - Member



Dabei seit:
Beiträge: 1892
Herkunft: Nordhausen, Nörten-Hardenberg

beantworten | zitieren | melden

Setzt am besten auch in deinem WebRequest Accept auf */*
Per Default wird dort nur Html angegeben, was z.B. bei WebAPI Aufrufen schon zu fehlern führt.
Dann dürfte es auch klappen :)

Anbei brauchst du im finally Block Response nicht zu IDisposable casten.
HttpWebResponse ist bereits eine Ableitung bzw. Implementierung von IDisposable, entsprechend kannst du die Dispose Methode ohne casting aufrufen.
Am sinnvollsten wäre es auch, wenn du den Response direkt in ein using packst.
using wird zu deinem try/finally umgewandelt und disposed dann auch das Objekt im Falle einer Exception!

T-Virus
Dieser Beitrag wurde 3 mal editiert, zum letzten Mal von T-Virus am .
Developer, Developer, Developer, Developer....

99 little bugs in the code, 99 little bugs. Take one down, patch it around, 117 little bugs in the code.
private Nachricht | Beiträge des Benutzers
CrocodileDundee
myCSharp.de - Member



Dabei seit:
Beiträge: 54

Themenstarter:

beantworten | zitieren | melden

Habe jetzt den Accept-Header entsprechend gesetzt, leider
bekomme ich immer noch die Fehlermeldung.
Zitat von CrocodileDundee


        // Request data from URI
        public string makeRequest()
        {
            // Declarations
            string strResponseValue = string.Empty;
            string endpoint = $"https:/www.wrike.com/api/v4/contacts?me=true";

            HttpWebRequest request = (HttpWebRequest)WebRequest.Create(endPoint);

            request.Method = "GET";

            request.Accept = $"*/*";       */ // Accept eingefügt

            request.Headers.Add("Authorization", "Bearer XXXYYYZZZ"); 

            HttpWebResponse response = null;

            try
            {
                response = (HttpWebResponse)request.GetResponse();

 		// ---------------------------------------------------
		// An dieser Stelle wird die Ausnahme geworfen
 		// ---------------------------------------------------
                using (Stream responseStream = response.GetResponseStream())
                {
                    if (responseStream != null)
                    {
                        using (StreamReader reader = new StreamReader(responseStream))
                        {
                            strResponseValue = reader.ReadToEnd();
                        }
                    }
                }
            }
            catch(Exception ex)
            {
                strResponseValue = "{\"errorMessages\":[\"" + ex.Message.ToString() + "\"],\"errors\":{}}"; 
            }
            finally
            {
                if(response != null)
                {
                    ((IDisposable)response).Dispose();
                }
            }
            return strResponseValue;
        }
private Nachricht | Beiträge des Benutzers
T-Virus
myCSharp.de - Member



Dabei seit:
Beiträge: 1892
Herkunft: Nordhausen, Nörten-Hardenberg

beantworten | zitieren | melden

Ich habe mal ein kleines Test mit dotnet Fodler gemacht und dort den Code etwas angepasst und aufgeräumt.

Dort erhalte ich dann als Antwort folgende:
Zitat
{"errorMessages":["Invalid URI: The Authority/Host could not be parsed."],"errors":{}}

Da ich keinen Token habe, kann ich mich auch nicht anmelden, erhalte aber deine Meldung auch nicht und die Verbindung konnte generell hergestellt werden.

Link

T-Virus
Dieser Beitrag wurde 2 mal editiert, zum letzten Mal von T-Virus am .
Developer, Developer, Developer, Developer....

99 little bugs in the code, 99 little bugs. Take one down, patch it around, 117 little bugs in the code.
private Nachricht | Beiträge des Benutzers
CrocodileDundee
myCSharp.de - Member



Dabei seit:
Beiträge: 54

Themenstarter:

beantworten | zitieren | melden

Hallo T-Virus,
nochmal vielen Dank für deine Bemühungen!

Das Programm funktioniert jetzt, wobei ich noch die folgende Zeile bzgl. des Security Protocols einfügen musste:


ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls | SecurityProtocolType.Tls11 | SecurityProtocolType.Tls12;

Kannst du mir jemand vielleicht ein Tipp bzgl. Literatur über C# in Verbindung mit http geben?

Vielen Dank!
private Nachricht | Beiträge des Benutzers
codesoldier
myCSharp.de - Member



Dabei seit:
Beiträge: 29

beantworten | zitieren | melden

@CrocodileDundee:

Mit PostMan kann Du Dir den C#-Code generieren lassen.
Dazu einfach den Code-Button betätigen und dann C# auswählen:
https://learning.getpostman.com/docs/postman/sending_api_requests/generate_code_snippets/

Einzige Voraussetzung ist dass Du RestSharp verwendest:
http://restsharp.org/
Dieser Beitrag wurde 1 mal editiert, zum letzten Mal von codesoldier am .
private Nachricht | Beiträge des Benutzers
CrocodileDundee
myCSharp.de - Member



Dabei seit:
Beiträge: 54

Themenstarter:

beantworten | zitieren | melden

Hallo, nochmal danke für die Hilfe, läuft jetzt

Eine Frage hab ich aber noch:
Ich würde gerne in einer Textbox anzeigen lassen, was der http-Treiber letztendlich gesendet hat, so wie ich das auch bei Postman mir anzeigen lassen kann, z.B:

GET /api/v4/contacts?me=true HTTP/1.1
Host: www.wrike.com
Authorization: Bearer XXXYYYZZZ
User-Agent: PostmanRuntime/7.16.3
Accept: */*
--- etc. ---
--- etc. ---

Hab gesehen, daß es die Methode "GetRequestStream" gibt, aber die scheint wohl nicht die richtige zu sein. Gibt es da eine (einfache) Möglichkeit?

Danke und Gruß
Frank
private Nachricht | Beiträge des Benutzers
pinki
myCSharp.de - Member

Avatar #avatar-4072.jpg


Dabei seit:
Beiträge: 703
Herkunft: OWL

beantworten | zitieren | melden

Hallo,
was steht denn im RequestStream drin?
Ich hätte da jetzt genau das erwartet...
private Nachricht | Beiträge des Benutzers
codesoldier
myCSharp.de - Member



Dabei seit:
Beiträge: 29

beantworten | zitieren | melden

Vielleicht hilft Dir Fiddler hier weiter?
https://www.telerik.com/fiddler

Da siehst Du dann auch die Antwortzeiten, die Größe des Requests / Response usw.
Dieser Beitrag wurde 1 mal editiert, zum letzten Mal von codesoldier am .
private Nachricht | Beiträge des Benutzers