myCSharp.de - DIE C# und .NET Community
Willkommen auf myCSharp.de! Anmelden | kostenlos registrieren
 
 | Suche | FAQ

» Hauptmenü
myCSharp.de
» Startseite
» Forum
» FAQ
» Artikel
» C#-Snippets
» Jobbörse
» Suche
» Regeln
» Wie poste ich richtig?
» Forum-FAQ

Mitglieder
» Liste / Suche
» Wer ist wo online?

Ressourcen
» openbook: Visual C#
» openbook: OO
» Microsoft Docs

Team
» Kontakt
» Übersicht
» Wir über uns

» myCSharp.de Diskussionsforum
Du befindest Dich hier: Community-Index » Diskussionsforum » Entwicklung » Web-Technologien » Einen GET-Request mit Bearer-Token aus C#-Anwendung (HttpWebRequest) feuern?
Letzter Beitrag | Erster ungelesener Beitrag Druckvorschau | Thema zu Favoriten hinzufügen

Antwort erstellen
Zum Ende der Seite springen  

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

 
Autor
Beitrag « Vorheriges Thema | Nächstes Thema »
CrocodileDundee
myCSharp.de-Mitglied

Dabei seit: 23.03.2018
Beiträge: 39


CrocodileDundee ist offline

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

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

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

C#-Code:
        // 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
31.08.2019 20:46 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
T-Virus T-Virus ist männlich
myCSharp.de-Mitglied

Dabei seit: 17.04.2008
Beiträge: 1.287
Entwicklungsumgebung: Visual Studio, Codeblocks, Edi
Herkunft: Nordhausen, Nörten-Hardenberg


T-Virus ist offline Füge T-Virus Deiner Kontaktliste hinzu

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

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 31.08.2019 21:01.

31.08.2019 20:56 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
CrocodileDundee
myCSharp.de-Mitglied

Dabei seit: 23.03.2018
Beiträge: 39

Themenstarter Thema begonnen von CrocodileDundee

CrocodileDundee ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

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

Zitat von CrocodileDundee:
C#-Code:
        // 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;
        }
01.09.2019 16:57 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
T-Virus T-Virus ist männlich
myCSharp.de-Mitglied

Dabei seit: 17.04.2008
Beiträge: 1.287
Entwicklungsumgebung: Visual Studio, Codeblocks, Edi
Herkunft: Nordhausen, Nörten-Hardenberg


T-Virus ist offline Füge T-Virus Deiner Kontaktliste hinzu

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

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 01.09.2019 17:38.

01.09.2019 17:37 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
CrocodileDundee
myCSharp.de-Mitglied

Dabei seit: 23.03.2018
Beiträge: 39

Themenstarter Thema begonnen von CrocodileDundee

CrocodileDundee ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

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:

C#-Code:
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!
02.09.2019 09:00 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
codesoldier
myCSharp.de-Mitglied

Dabei seit: 14.09.2016
Beiträge: 26


codesoldier ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

@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 02.09.2019 14:56.

02.09.2019 14:55 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
CrocodileDundee
myCSharp.de-Mitglied

Dabei seit: 23.03.2018
Beiträge: 39

Themenstarter Thema begonnen von CrocodileDundee

CrocodileDundee ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

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

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
03.09.2019 09:26 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
pinki
myCSharp.de-Mitglied

avatar-4072.jpg


Dabei seit: 24.08.2008
Beiträge: 664
Herkunft: OWL


pinki ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

Hallo,
was steht denn im RequestStream drin?
Ich hätte da jetzt genau das erwartet...
03.09.2019 12:51 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
codesoldier
myCSharp.de-Mitglied

Dabei seit: 14.09.2016
Beiträge: 26


codesoldier ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

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 03.09.2019 17:39.

03.09.2019 17:39 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
Baumstruktur | Brettstruktur       | Top 
myCSharp.de | Forum
Antwort erstellen


© Copyright 2003-2019 myCSharp.de-Team | Impressum | Datenschutz | Alle Rechte vorbehalten. | Dieses Portal verwendet zum korrekten Betrieb Cookies. 22.09.2019 18:07