2011-11-25 2 views
71

Json 문자열을 반환하는 ASP.Net MVC3에서 웹 서비스를 호스팅하고 있습니다. C# 콘솔 응용 프로그램에서 webservice를 호출하고 반환을 .NET 객체로 구문 분석하는 가장 좋은 방법은 무엇입니까?.NET 콘솔에서 JSON WebService를 호출하는 가장 좋은 방법

내 콘솔 앱에서 MVC3을 참조해야합니까?

Json.Net에는 .NET 객체 직렬화 및 비 직렬화를위한 멋진 메소드가 있지만 웹 서비스에서 값을 가져오고 가져 오는 방법이 있다는 것을 알지 못합니다.

아니면 그냥 웹 서비스에 게시하고 가져 오기위한 자체 도우미 메서드를 만들어야합니까? .net 객체를 키 값 쌍으로 직렬화하는 방법은 무엇입니까?

답변

113

웹 서비스에서 GET하려면 HttpWebRequest를 사용합니다. 그러면 JSON 문자열이 반환됩니다. 나는 동적으로 문자열을 구문 분석 JSON.Net를 사용

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

: 그것은 GET에 대해이 같이 보입니다. 은 또는이 CodePlex의 도구를 사용하여 샘플 JSON 출력에서 ​​정적으로 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 
    } 
} 

나는 우리의 웹 서비스의 자동화 된 테스트에서 같은 코드를 사용합니다.

+0

예, POST 예제가 도움이 될 것입니다. – BrokeMyLegBiking

+1

좋아요, POST 예제를 추가했습니다 – GarethOwen

+0

JsonClassGenerator가 멋졌습니다. 역 직렬화는 json 문자열을 전달하여 강력한 형식의 객체를 생성하기 만하면 쉽습니다. – AaronLS

45

WebClient 원격 URL에서 내용을 가져오고 JavaScriptSerializer 또는 Json.NET을 사용하여 JSON을 .NET 객체로 역 직렬화합니다.

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 클라이언트 프레임 워크가 있습니다 : 예를 들어, 당신은 다음 JSON 구조를 반영하는 모델 클래스를 정의합니다.

+0

@BrokeMyLegBiking, 어느 것입니까? ASPAjax와는 아무런 관련이 없습니다. JavaScriptSerializer 클래스에 대해 말하면 System.Web.Extensions 어셈블리의 .NET에 내장되어 있으므로 다운로드하거나 설치할 필요가 없습니다. –

+0

C# 개체의 모든 propertynames/속성 값을 POST 키 - 값 쌍 (또는 GET 키 - 값 쌍)으로 바꾸는 방법이 있습니까? 그래서 나는 효과적으로 내 webservice 메서드에 대한 입력 값으로 C# 개체를 사용할 수 있습니까? – BrokeMyLegBiking

+0

@BrokeMyLegBiking, 당신이 가지고있는 객체와 웹 서비스가 어떻게 입력을 기대하는지에 달려 있습니다. –

관련 문제