Fragensteller
In einer mit einem Zertifikat gesicherten Übertragung ein JSON zu einer URI senden

Allgemeine Diskussion
-
Wie kann ich bitte ein JSON Objekt zu einem Webserver Pfad schicken? Ich habe nun diverse Möglichkeiten ausprobiert, bin aber als Anfänger einfach überfordert...
Hier mein Code den ich bis jetzt dazu recherchiert/programmiert habe:
Klasse Mm.cs
// Define the JSON Mm mm = new Mm() { email = email, usercount = usercount };
Klasse MmApi.cs
public async Task<string> MmApiPostAsync(string email, string usercount) { try { // Build the JSON (Newtonsoft JSON Referenz wird verwendet da diese "sicherer" sein soll) string json = JsonConvert.SerializeObject(mm, Formatting.Indented); Console.WriteLine(json); // Use the certificate X509Certificate2Collection certificates = new X509Certificate2Collection(); certificates.Import(pathToCertificate, password, X509KeyStorageFlags.MachineKeySet | X509KeyStorageFlags.PersistKeySet); ServicePointManager.ServerCertificateValidationCallback = (a, b, c, d) => true; // Define the HTTPS HttpWebRequest request = (HttpWebRequest)WebRequest.Create(uriToMmServer); request.AllowAutoRedirect = true; request.ClientCertificates = certificates; request.Method = "POST"; //request.ContentType = "application/x-www-form-urlencoded"; request.ContentType = "application/json"; string postData = "login-form-type=cert"; byte[] postByte = Encoding.UTF8.GetBytes(postData); request.ContentLength = postByte.Length; using (StreamWriter streamWriter = new StreamWriter(request.GetRequestStream())) { streamWriter.Write(json); //no close/flush needed inside the using } HttpWebResponse response = (HttpWebResponse)request.GetResponse(); using (var streamReader = new StreamReader(response.GetResponseStream())) { result = streamReader.ReadToEnd(); } return result; } catch (Exception e) { Console.WriteLine($"FAILURE: Can't do HTTP POST for\nE-Mail: {email}\nUsercount: {usercount}\nDetails: {e}"); return $"FAILURE: Can't do HTTP POST for\nE-Mail: {email}\nUsercount: {usercount}\nDetails: {e}"; } }
Klappt aber nicht... Ist das so überhaupt die richtige Art und Weise sowas zu machen? Gibt es vielleicht eine Dokumentation/Buch zu dem Thema, welches das Thema besser beschreibt? Als Neuling ist das schon ziemlich schwierig die beste Möglichkeit herauszufinden. Besonders weil viele Artikel im Internet noch aus dem Jahr ~2013 sind...
- Bearbeitet dr34mup Freitag, 27. Oktober 2017 09:12 Mehr Informationen hinzugefügt
- Typ geändert Stefan FalzModerator Samstag, 31. März 2018 19:08 Thread inaktiv, keine weitere Aktivität
Alle Antworten
-
Hi,
"klappt nicht" ist leider nichts, mit dem wir auch nur irgendwas anfangen könnten.
Was genau "klappt nicht"? Welche Fehlermeldung erhältst Du? (Bitte die exakte und vollständige Meldung posten)
So auf die Schnelle: Warum sendest Du json, "postData" aber nicht?
Ist das eine normale SSL Verbindung oder brauchst Du das clientseitige Zertifikat wirklich?
Gruß, Stefan
Microsoft MVP - Visual Developer ASP/ASP.NET
http://www.asp-solutions.de/ - Consulting, Development
http://www.aspnetzone.de/ - ASP.NET Zone, die ASP.NET Community -
Hallo,
"klappt nicht" habe ich deshalb geschrieben, weil ich nun schon mehrere Möglichkeiten probiert und schon alle möglichen Fehlermeldungen bekommen habe. Diese ist nun die aktuelle:
"Die Anfrage wurde abgebrochen: Die Anfrage wurde abgebrochen.."
InnerException = {"Stream kann nicht geschlossen werden, bevor alle Bytes geschrieben wurden."}
Ich habe ehrlich gesagt, nur halbwegs Ahnung was ich da tue. Diesen ganzen Code habe ich mir mit der Hilfe des Internets zusammengebastelt.
Mit der umgebauten Variante
streamWriter.Write(json, postData);
bekomme ich leider die selbe Fehlermeldung. Mal sehen was das Internet dazu sagt, allerdings wäre es mir wirklich lieber, wenn ich einmal ein aktuelles How-To finden würde an dem man sich auch orientieren kann.
EDIT: Ja, das Zertifikat muss ich mitschicken, ohne geht das nicht da der Server nur zertifizierte Anfragen zulässt.
- Bearbeitet dr34mup Montag, 30. Oktober 2017 08:01
-
Ich habe es nun einmal anders probiert:
Stream write = request.GetRequestStream(); write.Write(postByte, 0, postByte.Length);
Was allerdings auffällt sind 2 Fehlermeldungen im Object "write":
Length = '((System.Net.ConnectStream)write).Length' threw an exception of type 'System.NotSupportedException'
Position = '((System.Net.ConnectStream)write).Position' threw an exception of type 'System.NotSupportedException'
Und was ich auch nicht ganz verstehe ist wie ich damit die Rückgabe wieder bekomme...
- Bearbeitet dr34mup Montag, 30. Oktober 2017 09:49