2011-11-25 25 views
71

Tôi đang lưu trữ một dịch vụ web trong ASP.Net MVC3 trả về một chuỗi Json. Cách tốt nhất để gọi webservice từ một ứng dụng giao diện điều khiển C# là gì, và phân tích cú pháp trả về thành một đối tượng .NET?Cách tốt nhất để gọi một WebService JSON từ .NET Console

Tôi có nên tham chiếu MVC3 trong ứng dụng bảng điều khiển của mình không?

Json.Net có một số phương pháp tốt đẹp để tuần tự hóa và deserializing các đối tượng .NET, nhưng tôi không thấy rằng nó có cách để POSTING và GETing giá trị từ một webservice.

Hoặc tôi có nên tạo phương thức trợ giúp của riêng mình cho BẬT và TỚI dịch vụ web không? Làm thế nào tôi sẽ serialize đối tượng .net của tôi cho các cặp khóa giá trị?

Trả lời

113

Tôi sử dụng HttpWebRequest để GET từ dịch vụ web, trả về cho tôi một chuỗi JSON. Có vẻ như thế này có dạng 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; 
    } 
} 

Sau đó, tôi sử dụng JSON.Net để phân tích cú pháp chuỗi động. Ngoài ra, bạn có thể tạo ra C# lớp tĩnh từ đầu ra mẫu JSON sử dụng công cụ CodePlex này: http://jsonclassgenerator.codeplex.com/

POST trông như thế này:

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

tôi sử dụng mã như thế này trong các bài kiểm tra tự động của dịch vụ web của chúng tôi.

+0

có, ví dụ POST sẽ hữu ích. – BrokeMyLegBiking

+1

OK, tôi đã thêm ví dụ POST – GarethOwen

+0

JsonClassGenerator thật tuyệt vời. Deserialization là dễ dàng như bạn chỉ cần xây dựng các đối tượng gõ mạnh mẽ bằng cách đi qua chuỗi json. – AaronLS

45

WebClient để tìm nạp nội dung từ url từ xa và JavaScriptSerializer hoặc Json.NET để deserialize JSON vào đối tượng .NET. Ví dụ bạn định nghĩa một lớp mô hình đó sẽ phản ánh cấu trúc JSON và sau đó:

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 
} 

Ngoài ra còn có một số khuôn khổ khách hàng REST của bạn có thể kiểm như RestSharp.

+0

@BrokeMyLegBiking, cái nào? Nó không liên quan gì đến ASPAjax. Nếu bạn đang nói về lớp JavaScriptSerializer nó được xây dựng trong .NET trong assembly System.Web.Extensions để bạn không phải tải xuống hay cài đặt bất cứ thứ gì. –

+0

Có cách nào để biến tất cả các giá trị thuộc tính/thuộc tính của đối tượng C# thành cặp khóa-giá trị POST (hoặc GET cặp khóa-giá trị) không? sao cho tôi có thể sử dụng đối tượng C# một cách hiệu quả làm giá trị đầu vào cho phương thức webservice của tôi? – BrokeMyLegBiking

+0

@BrokeMyLegBiking, điều đó sẽ phụ thuộc vào đối tượng bạn có và cách dịch vụ web mong đợi đầu vào. –

Các vấn đề liên quan