1

私は現在、内部 API とビジュアル スタジオを使用しています (どちらも新しい)。ユーザー情報を含む JSON を取得するサーバーに GET 要求を送信しようとしています。予想される JSON 応答のフィールドの 1 つは connect_status で、接続している場合は true を示し、接続が完了すると false を示し、応答が受信されたことを意味します。これまでのところ、Sleep を使用して次の作業を行って、応答が得られるまで少し待ちました。

    bool isConnected;
    HttpWebRequest request = (HttpWebRequest)WebRequest.Create("http://localhost");
    request.Method = WebRequestMethods.Http.Get;
    request.ContentType = "application/json"; 
    System.Threading.Thread.Sleep(10000);
    do
    {
        HttpWebResponse response = (HttpWebResponse)request.GetResponse();
        Stream receiveStream = response.GetResponseStream();
        StreamReader info = new StreamReader(receiveStream);
        string json = info.ReadToEnd();
        accountInfo user1 = JsonConvert.DeserializeObject<accountInfo>(json);
        Console.WriteLine(jsonResponse);
        isConnected = user1.connect_status;
    }
    while (isConnected == true);

これに関する問題は、より長い時間待機する必要があることです。所要時間は可変であるため、より長いスリープ時間を設定する必要があります。また、10 秒では不十分な場合もあります。その場合、do while ループが 2 回目にループすると、while(isConnected==true) で例外が発生します。

NUllReferenceException は処理されませんでした。オブジェクト参照がオブジェクト インスタンスに設定されていません。

私がやっている方法が正しいとは思わないので、これを行うためのより良い/別の方法は何でしょうか。

4

1 に答える 1

2

.NET 4.5 を使用している場合、ここに 1 つのオプションがあります。

HttpMessageHandler handler = new HttpClientHandler { CookieContainer = yourCookieContainer };

HttpClient client = new HttpClient(handler) {
    BaseAddress = new Uri("http://localhost")
};

client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));

HttpContent content = new StringContent("dataForTheServerIfAny");

HttpResponseMessage response = await client.GetAsync("relativeActionUri", content);
string json = await response.Content.ReadAsStringAsync();
accountInfo user1 = JsonConvert.DeserializeObject<accountInfo>(json);

このようにして、.NET に待機などを任せることができます。

于 2013-07-18T21:55:05.727 に答える