2013-07-15 14 views
2

我正在開發一個使用C#的Windows應用商店應用程序,並且在這個平臺上我非常新(我一直主要在IOS和Android上工作)。從WebResponse類讀取數據時提前結束

我有一個簡單的異步方法從遠程服務器下載原始數據。它工作正常,但我一直看到來自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; 
} 
+0

我編輯了自己的冠軍。請參閱:「[應該在其標題中包含」標籤「](http://meta.stackexchange.com/questions/19190/)」,其中的共識是「不,他們不應該」。 –

+0

我在標題中添加窗口商店應用的原因是,當谷歌搜索時,標籤不被拉取,這個特定的類名稱太常見了,使得搜索非常困難 – rydgaze

+0

事實證明,情況並非如此。搜索期間非常明確地使用標籤。 –

回答

0

我切換到使用HttpClient和HttpClientHandler,它完美的工作。這也支持存儲cookies並在每次通話時重複使用。

以下是可以處理GET和POST並將數據作爲byte []數組返回的代碼。如果響應是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; 
    } 

}

相關問題