2011-11-25 15 views
71

私はJson文字列を返すASP.Net MVC3でWebサービスをホストしています。 C#コンソールアプリケーションからWebサービスを呼び出して、.NETオブジェクトへの戻り値を解析する最良の方法は何ですか?.NETコンソールからJSON WebServiceを呼び出す最良の方法

コンソールアプリケーションでMVC3を参照する必要がありますか?

Json.Netには、.NETオブジェクトをシリアライズおよびデシリアライズするためのいくつかの素晴らしい方法がありますが、Webサービスから値を取得および取得する方法はありません。

また、WebサービスへのPOSTおよびGETのための独自のヘルパーメソッドを作成する必要がありますか?どのようにして、私の.netオブジェクトをキーの値のペアにシリアル化しますか?

答えて

113

私はWebサービスから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 
    } 
} 

私は弊社のWebサービスの自動化されたテストでは、このようなコードを使用します。

+0

はい、POSTの例が参考になります。 – BrokeMyLegBiking

+1

OK、POSTの例を追加しました – GarethOwen

+0

JsonClassGeneratorは素晴らしいです。逆シリアル化は、json文字列を渡すことによって強く型付けされたオブジェクトを構築するだけで簡単です。 – AaronLS

45

WebClientリモートURLからコンテンツを取得し、JavaScriptSerializerまたはJson.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#オブジェクトのすべてのpropertynames /プロパティ値をPOSTキー値ペア(またはGETキー値ペア)にする方法はありますか?私は効果的に私のWebサービスメソッドの入力値としてC#オブジェクトを使用することができますか? – BrokeMyLegBiking

+0

@BrokeMyLegBikingは、あなたが持っているオブジェクトとWebサービスが入力をどのように期待しているかによって異なります。 –

関連する問題