2011-11-25 8 views
71

Sto ospitando un servizio Web in ASP.Net MVC3 che restituisce una stringa Json. Qual è il modo migliore per chiamare il servizio web da un'applicazione console C# e analizzare il ritorno in un oggetto .NET?Il modo migliore per chiamare un JSON WebService da una console .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 POST e GET per il servizio web? Come posso serializzare il mio oggetto .net in coppie di valori chiave?

risposta

113

Uso HttpWebRequest per ottenere dal servizio Web, che restituisce una stringa JSON. Sembra qualcosa di simile 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; 
    } 
} 

Ho quindi utilizzare JSON.Net per analizzare dinamicamente la stringa. In alternativa, è possibile generare la classe C# staticamente da un esempio di output JSON utilizzando 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 il codice come questo in test automatizzati del nostro servizio web.

+0

sì, un esempio di POST sarebbe utile. – BrokeMyLegBiking

+1

OK, ho aggiunto l'esempio POST – GarethOwen

+0

JsonClassGenerator è fantastico. La deserializzazione è facile poiché si costruisce l'oggetto fortemente tipizzato passando la stringa json. – AaronLS

45

WebClient per recuperare il contenuto dall'URL remoto e JavaScriptSerializer o Json.NET per deserializzare JSON in un oggetto .NET. Per esempio si definisce una classe del modello che rifletterà la struttura JSON e poi:

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

ci sono anche alcuni quadri client REST si può checkout come RestSharp.

+0

@BrokeMyLegBiking, quale? Non ha nulla a che fare con ASPAjax. Se stai parlando della classe JavaScriptSerializer, è integrata in .NET nell'assembly System.Web.Extensions, quindi non devi scaricare o installare nulla. –

+0

Esiste un modo per trasformare tutti i nomi di proprietà/valori di proprietà di un oggetto C# in coppie di valori-chiave POST (o coppie di valori-chiave GET)? in modo che io possa utilizzare efficacemente l'oggetto C# come valore di input per il mio metodo webservice? – BrokeMyLegBiking

+0

@BrokeMyLegBiking, che dipenderà dall'oggetto che hai e da come il servizio web si aspetta l'input. –

Problemi correlati