2011-11-25 102 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服务如何预期输入。 –

相关问题