2011-11-25 79 views
71

我在ASP.Net MVC3中託管了一個Web服務,它返回一個Json字符串。從c#控制檯應用程序調用webservice並將返回值解析爲.NET對象的最佳方法是什麼?從.NET控制檯調用JSON WebService的最佳方式

我應該在我的控制檯應用中引用MVC3嗎?

Json.Net有一些很好的序列化和反序列化.NET對象的方法,但我沒有看到它有從Web服務中獲取和發佈數據的方法。

或者我應該只是創建自己的幫助方法開機自檢和獲取Web服務?我如何將我的.net對象序列化爲鍵值對?

回答

113

我使用HttpWebRequest從Web服務進行GET,這會返回一個JSON字符串。它看起來像這樣一個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; 
    } 
} 

然後我使用JSON.Net來動態地解析字符串。 或者,您可以靜態地從樣品JSON輸出使用這個CodePlex上工具生成C#類:http://jsonclassgenerator.codeplex.com/

POST看起來是這樣的:

// 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 
    } 
} 

我用這樣的代碼在我們的Web服務的自動化測試。

+0

是的,POST示例會很有幫助。 – BrokeMyLegBiking

+1

好的,我添加了POST示例 – GarethOwen

+0

JsonClassGenerator非常棒。反序列化很容易,因爲您只需通過傳遞json字符串來構造強類型對象。 – AaronLS

45

WebClient從遠程url獲取內容,JavaScriptSerializerJson.NET將JSON反序列化爲.NET對象。例如,你定義一個模型類,這將反映JSON結構,然後:

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 
} 

也有可能籤如RestSharp一些REST客戶端框架。

+0

@BrokeMyLegBiking,哪一個?它與ASPAjax無關。如果您正在討論JavaScriptSerializer類,它將在System.Web.Extensions程序集的.NET中構建,因此您不必下載或安裝任何東西。 –

+0

有沒有辦法將c#對象的所有屬性名/屬性值轉換爲POST鍵值對(或GET鍵值對)?這樣我可以有效地使用c#對象作爲我的webservice方法的輸入值? – BrokeMyLegBiking

+0

@BrokeMyLegBiking,這取決於您擁有什麼對象以及Web服務如何預期輸入。 –