Laden...

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

Erstellt von CrocodileDundee vor 4 Jahren Letzter Beitrag vor 4 Jahren 4.916 Views
C
CrocodileDundee Themenstarter:in
51 Beiträge seit 2018
vor 4 Jahren
Einen GET-Request mit Bearer-Token aus C#-Anwendung (HttpWebRequest) feuern?

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:> _Fehlermeldung:_ > "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

T
2.219 Beiträge seit 2008
vor 4 Jahren

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

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.

C
CrocodileDundee Themenstarter:in
51 Beiträge seit 2018
vor 4 Jahren

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

  
        // 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;  
        }  
  
T
2.219 Beiträge seit 2008
vor 4 Jahren

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:

{"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

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.

C
CrocodileDundee Themenstarter:in
51 Beiträge seit 2018
vor 4 Jahren

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!

C
26 Beiträge seit 2016
vor 4 Jahren

@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/

C
CrocodileDundee Themenstarter:in
51 Beiträge seit 2018
vor 4 Jahren

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

709 Beiträge seit 2008
vor 4 Jahren

Hallo,
was steht denn im RequestStream drin?
Ich hätte da jetzt genau das erwartet...

C
26 Beiträge seit 2016
vor 4 Jahren

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.