2013-07-15 1 views
2

C#을 사용하여 Windows Store App을 개발 중이며이 플랫폼에서 매우 새로 왔습니다 (주로 IOS와 Android에서 작업 해 왔습니다).WebResponse 클래스에서 읽는 중 데이터가 너무 빨리 끝납니다.

원격 서버에서 원시 데이터를 다운로드하는 간단한 Async 메서드가 있습니다. 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

제목에 창 저장 앱을 추가 한 이유 태그가 Google 검색시 추출되지 않고이 특정 클래스 이름이 너무 일반적이어서 검색이 매우 어려워졌습니다. – rydgaze

+0

그럴 수는 없습니다. 태그는 검색 중에 매우 명확하게 사용됩니다. –

답변

0

나는 HttpClient와 HttpClientHandler를 사용하여 전환했으며 완벽하게 작동합니다. 또한 쿠키를 저장하고 모든 호출에서이를 다시 사용할 수 있습니다.

GET 및 POST를 모두 처리하고 데이터를 바이트 배열 []로 반환 할 수있는 코드는 다음과 같습니다. 응답이 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; 
    } 

}

관련 문제