Il modo migliore per chiamare un JSON WebService da una console .NET

Sto ospitando un servizio web in ASP.Net MVC3 che restituisce una stringa Json. Qual è il modo migliore per chiamare il servizio web dall’applicazione console # ac e analizzare il ritorno in un object .NET?

Devo fare riferimento a MVC3 nella mia app per console?

Json.Net ha alcuni buoni metodi per serializzare e deserializzare oggetti .NET, ma non vedo che abbia modi per POST e GET dei valori da un webservice.

O dovrei semplicemente creare il mio metodo di supporto per POSTing e GETing al servizio web? Come posso serializzare il mio object .net in coppie di valori chiave?

Io uso HttpWebRequest per ottenere dal servizio web, che mi restituisce una stringa JSON. Sembra qualcosa del genere per un GET:

// Returns JSON string string GET(string url) { HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url); try { WebResponse response = request.GetResponse(); using (Stream responseStream = response.GetResponseStream()) { StreamReader reader = new StreamReader(responseStream, System.Text.Encoding.UTF8); return reader.ReadToEnd(); } } catch (WebException ex) { WebResponse errorResponse = ex.Response; using (Stream responseStream = errorResponse.GetResponseStream()) { StreamReader reader = new StreamReader(responseStream, System.Text.Encoding.GetEncoding("utf-8")); String errorText = reader.ReadToEnd(); // log errorText } throw; } } 

Quindi utilizzo JSON.Net per analizzare in modo dinamico la stringa. In alternativa, puoi generare la class C # staticamente dall’output JSON di esempio usando questo strumento codeplex: http://jsonclassgenerator.codeplex.com/

POST assomiglia a questo:

 // POST a JSON string void POST(string url, string jsonContent) { HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url); request.Method = "POST"; System.Text.UTF8Encoding encoding = new System.Text.UTF8Encoding(); Byte[] byteArray = encoding.GetBytes(jsonContent); request.ContentLength = byteArray.Length; request.ContentType = @"application/json"; using (Stream dataStream = request.GetRequestStream()) { dataStream.Write(byteArray, 0, byteArray.Length); } long length = 0; try { using (HttpWebResponse response = (HttpWebResponse)request.GetResponse()) { length = response.ContentLength; } } catch (WebException ex) { // Log exception and throw as for GET example above } } 

Io uso un codice come questo nei test automatici del nostro servizio web.

WebClient per recuperare i contenuti dall’URL remoto e JavaScriptSerializer o Json.NET per deserializzare il JSON in un object .NET. Ad esempio, si definisce una class del modello che rifletterà la struttura JSON e quindi:

 using (var client = new WebClient()) { var json = client.DownloadString("http://example.com/json"); var serializer = new JavaScriptSerializer(); SomeModel model = serializer.Deserialize(json); // TODO: do something with the model } 

Esistono anche alcuni framework client REST che è ansible eseguire il checkout come RestSharp .

Sebbene le risposte esistenti siano approcci validi, sono antiquate. HttpClient è un’interfaccia moderna per lavorare con i servizi web RESTful. Controlla la sezione degli esempi della pagina nel link, ha un caso d’uso molto semplice per un HTTP GET asincrono.