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
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.
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; }
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.
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.
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!
@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/
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
Hallo,
was steht denn im RequestStream drin?
Ich hätte da jetzt genau das erwartet...
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.