So veröffentlichen Sie JSON an einen server mit C#?
Hier ist der code, den ich verwende:
//create a request
HttpWebRequest request = (HttpWebRequest)
WebRequest.Create(url); request.KeepAlive = false;
request.ProtocolVersion = HttpVersion.Version10;
request.Method = "POST";
//turn our request string into a byte stream
byte[] postBytes = Encoding.UTF8.GetBytes(json);
//this is important - make sure you specify type this way
request.ContentType = "application/json; charset=UTF-8";
request.Accept = "application/json";
request.ContentLength = postBytes.Length;
request.CookieContainer = Cookies;
request.UserAgent = currentUserAgent;
Stream requestStream = request.GetRequestStream();
//now send it
requestStream.Write(postBytes, 0, postBytes.Length);
requestStream.Close();
//grab te response and print it out to the console along with the status code
HttpWebResponse response = (HttpWebResponse)request.GetResponse();
string result;
using (StreamReader rdr = new StreamReader(response.GetResponseStream()))
{
result = rdr.ReadToEnd();
}
return result;
Wenn ich laufen gehe, ich bin immer 500 internal server error.
Was mache ich falsch?
- Erstens, stellen Sie sicher, dass die Daten, die Sie posten, was der server erwartet.
- tatsächlich, es sieht aus wie ich war Entsendung ungültige Daten...
- Für eine einfache Arbeit, die Sie hinzufügen können, json "Bibliothek", um Ihre visual studio zu
- Sollte der server nicht zum Absturz mit fehlerhaften Daten. Einen bug-report.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Die Art, wie ich es und arbeitet, ist:
Schrieb ich eine Bibliothek zum ausführen dieser Aufgabe in einem einfacheren Weg, es ist hier: https://github.com/ademargomes/JsonRequest
Hoffe, es hilft.
Close
wenn inusing
?public ActionResult SomeAction(string key)
?async
Methoden, wo es verfügbar ist, eine gute Sache zu tun, wenn Sie in einen asynchronen Kontext. Eine andere Sache, die möchte ich hinweisen will, ist die Verwendung vonvar httpWebRequest = (HttpWebRequest)WebRequest.Create("http://url");
warum würden Sie wollen, erstellen Sie eineWebRequest
Instanz und dann analysieren es aufHttpWebRequest
während Sie haben eine MethodeCreateHttp
? Spart man analysiert das Objekt. e.gvar httpWebRequest = WebRequest.CreateHttp("http://url");
Ademar ' s Lösung kann verbessert werden durch die Nutzung
JavaScriptSerializer
'sSerialize
- Methode eine implizite Konvertierung des Objekts in JSON.Darüber hinaus ist es möglich zu nutzen, die
using
Anweisung die Standard-Funktionalität um weglassen explizit aufrufenFlush
undClose
.application/json
korrekt ist.JavaScriptSerializer
funktioniert nicht auf Unity3D. Ich verwendetusing System.Web.Script.Serialization
Richtlinie, aber namespaceWeb
existiert nicht.Den
HttpClient
Typ ist eine neuere Implementierung als dieWebClient
undHttpWebRequest
.Können Sie einfach die folgenden Zeilen.
Wenn Sie Ihren
HttpClient
mehr als einmal ist es empfehlenswert, immer nur eine Instanz und es wiederverwenden, oder den neuenHttpClientFactory
.HttpClientFactory
. Ich habe nicht Lesen Sie alle Antworten im verlinkten Thema, aber ich denke, dass es aktualisiert werden muss, wie es erwähnt nicht die Fabrik.Weiter nach Seans post, es ist nicht notwendig, um das nest der using-Anweisungen. Durch
using
, die StreamWriter-es wird gespült und geschlossen am Ende des Blocks, so dass keine Notwendigkeit, explizit aufrufen, dieFlush()
undClose()
Methoden:Kümmern sich um den Content-Typ Sie verwenden :
Quellen :
RFC4627
Anderen post
Wenn Sie aufrufen müssen, ist asynchron, dann verwenden Sie
Ich kam vor kurzem mit einem viel einfacheren Weg, um post ein JSON -, mit den zusätzlichen Schritt der Umwandlung von einem Modell, in meiner app. Beachten Sie, dass Sie haben, um das Modell [JsonObject] für Ihre controller, um die Werte und die Konvertierung zu tun.
Anfrage:
Modell:
Server-Seite:
Diese option nicht erwähnt:
Etwas anders und saubere Weg dies zu erreichen ist durch die Verwendung von HttpClient wie diese:
PostAsJsonAsync
ist nicht mehr verfügbar da .NET 4.5.2. VerwendenPostAsync
statt. Mehr hierusing
Aussage wie dieseIDisposable
Schnittstelle für einen GrundIch schließlich aufgerufen, im sync-Modus, indem Sie die .Ergebnis
var data = Encoding.ASCII.GetBytes(json);
byte[] postBytes = Encoding.UTF8.GetBytes(json);
ASCII-statt UFT8
WARNUNG! Ich habe eine sehr starke Ansicht zu diesem Thema.
.NET vorhandenen web-clients sind nicht Entwickler freundlich! WebRequest & WebClient sind hervorragende Beispiele dafür, "wie zu frustrieren, ein Entwickler". Sie sind ausführlich & kompliziert, mit zu arbeiten, wenn alles, was Sie tun möchten ist, einen einfachen Post-request in C#. HttpClient geht irgendwie bei der Bewältigung dieser Probleme, aber es immer noch zu kurz greift. Auf top von, dass in der Dokumentation von Microsoft ist schlecht ... ganz schlecht, es sei denn, Sie wollen, sieben Sie durch Seiten und Seiten von technischen Klappentext.
Open-source-Rettung. Es gibt drei ausgezeichnete open-source -, free-NuGet-Bibliotheken als alternativen. Gott sei Dank! Diese sind alle gut unterstützt, dokumentiert und ja, easy - Korrektur...super einfach, mit zu arbeiten.
Gibt es nicht viel zwischen Ihnen, aber ich würde ServiceStack.Text der leichte edge ...
Ok - was macht so ein Post-Request im JSON-Format so Aussehen wie in ServiceStack.Text?
Das ist eine Zeile code. Präzise & easy! Vergleichen Sie die oben auf .NET-Http-Bibliotheken.