2

私は C# を使用して Windows ストア アプリを開発していますが、このプラットフォームでは非常に新しいものです (私は主に IOS と Android に取り組んできました)。

リモートサーバーから生データをダウンロードする簡単な非同期メソッドがあります。WebResponse クラスからのランダムな不完全な読み取りが見られることを除けば、問題なく動作します。これは非常に単純な方法であり、なぜ途中で終了するのかわかりません。リモートサーバーは正常に動作しているため(ios/web/androidは正常に動作しており、データを取得しています)、明らかにここで何か間違ったことをしています。

この問題を解決するには、どんな助けも役に立ちます。

public async Task<byte[]> doGETRequestAsync(String url)
{
    callSuccess = false;

    byte[] responseFromServer = null;
    try
    {
        WebRequest request = WebRequest.Create(url);    
        request.Method = "GET";
        WebResponse response = await request.GetResponseAsync();

        using (Stream dataStream = response.GetResponseStream())
        {
            responseFromServer = new byte[response.ContentLength];
            int readCount = await dataStream.ReadAsync(responseFromServer, 0, (int)response.ContentLength);
            if (readCount != response.ContentLength)
                throw new IOException("Premature end of data. Expected: " + response.ContentLength + " received: " + readCount);
        }


        response.Dispose();

    }
    catch (HttpRequestException hre)
    {
        Debug.WriteLine("Exception performing network call : " + hre.ToString());
    }
    catch (Exception e)
    {
        Debug.WriteLine("Exception performing network call : " + e.ToString());
    }

    return responseFromServer;
}
4

1 に答える 1

0

HttpClient と HttpClientHandler の使用に切り替えたところ、完全に機能しました。これにより、Cookie の保存と呼び出しごとの再利用もサポートされます。

GET と POST の両方を処理し、データを bytes[] の配列として返すコードを次に示します。応答が utf8 でエンコードされた文字列の場合、バイトは System.Text.Encoding.UTF8.GetString(respBytes, 0, respBytes.Length); を使用して文字列に変換できます。

お役に立てば幸いです

class Network
{
   static CookieContainer cookieJar = new CookieContainer();
   List<KeyValuePair<string, string>> postParameters = new List<KeyValuePair<string, string>>();

   // Add post parameter before calling NetworkRequestAsync for POST calls.
   public void addPostParameter(String key, String value)
   {
       postParameters.Add(new KeyValuePair<string, string>(key, value));

    }

    public async Task<byte[]> NetworkRequestAsync(String url, bool GET_REQUEST)
    {
        callSuccess = false;
        byte[] respBytes = null;
        try
        {
            HttpClientHandler handler = new HttpClientHandler()
            {
                // Use and reuse cookies in the cookiejar 
                CookieContainer = cookieJar
            };

            handler.AllowAutoRedirect = false;
            handler.UseCookies = true;

            HttpClient client = new HttpClient(handler as HttpMessageHandler)
            {
                BaseAddress = new Uri(@url)
            };

            HttpResponseMessage response = null;

            if (GET_REQUEST)
            {
                response = await client.GetAsync(client.BaseAddress);
            }
            else
            {

                HttpContent content = new FormUrlEncodedContent(postParameters);
                //String postparam=await content.ReadAsStringAsync();
                //Debug.WriteLine("Post Param1=" + postparam);

                response = await client.PostAsync(client.BaseAddress, content);

                callSuccess = true;
            }

            respBytes = await response.Content.ReadAsByteArrayAsync();

        }
        catch (Exception e)
        {
            Debug.WriteLine("Exception performing network call : " + e.ToString());
        } 

        return respBytes;
    }

}

于 2013-07-16T21:33:26.670 に答える