1. ホーム
  2. c#

[解決済み] .NET コンソールから JSON WebService を呼び出す最良の方法

2023-02-16 16:01:37

質問

ASP.Net MVC3で、Json文字列を返すウェブサービスをホストしています。c#コンソールアプリケーションからウェブサービスを呼び出し、返されたものを.NETオブジェクトにパースする最良の方法は何でしょうか?

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

Json.Netには、.NETオブジェクトをシリアライズおよびデシリアライズするための素晴らしいメソッドがありますが、ウェブサービスから値をPOSTおよびGETするためのメソッドがあるとは思えません。

それとも、WebサービスにPOSTおよびGETするための独自のヘルパーメソッドを作成する必要がありますか?.netオブジェクトをどのようにキーと値のペアにシリアライズすればよいのでしょうか。

どのように解決するのですか?

私は、WebサービスからGETするためにHttpWebRequestを使用し、それは私に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 を使用して、文字列を動的にパースします。 あるいは、この 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
    }
}

私はこのようなコードを、私たちのウェブサービスの自動テストで使用しています。