2013-05-03 2 views
5

우리는 현재 웹 API를 사용하여 응용 프로그램에 RESTful 서비스를 제공하고 있습니다.이 서비스는 현재 WPF를 사용하고 있으므로 서비스 클라이언트가 필요합니다.HttpWebRequest 응답 스트림은 64KB의 데이터 만 반환합니다.

우리가 가진 문제는 응답 크기가 64k를 초과하면 ContentLength가 더 크다는 사실에도 불구하고 더 많은 데이터가 요청되는 경우 기본 스트림이 64k에서 중단되고 예외가 throw된다는 것입니다 (테스트 사례 ~ 125k)

다음은 서비스를 호출 우리의 방법이다 :

private HttpWebResponse CallServiceMethod<TDto>(Uri serviceURL, string method, out WebException requestExceptionDetail, TDto dto = null) where TDto : DTOBase 
{ 
    HttpWebRequest request; 
    HttpWebResponse response; 
    Encoding enc; 
    string encodedDto; 
    byte[] encodedDtoArray; 
    Stream writeStream; 

    request = WebRequest.CreateHttp(serviceURL); 
    request.Method = method; 

    if (dto != null) 
    { 
    enc = UTF8Encoding.Default; 
    encodedDto = String.Concat("=", JsonConvert.SerializeObject(dto)); 
    encodedDtoArray = enc.GetBytes(encodedDto); 

    request.ContentLength = encodedDtoArray.Length; 
    request.ContentType = "application/x-www-form-urlencoded"; 

    writeStream = request.GetRequestStream(); 
    writeStream.Write(encodedDtoArray, 0, encodedDtoArray.Length); 
    writeStream.Close(); 
    } 

    requestExceptionDetail = null; 

    try 
    { 
    response = (HttpWebResponse)request.GetResponse(); 
    } 
    catch (WebException wex) 
    { 
    response = (HttpWebResponse)wex.Response; 
    requestExceptionDetail = wex; 
    } 

    return response; 
} 

... 그리고 여기에 통해 응답을 전달 사이에 약간의 글루 로직, 응답을 디코딩하는 방법입니다.

private TObjectType DecodeResponse<TObjectType>(HttpWebResponse webResponse) 
{ 
    Encoding enc; 
    StreamReader responseReader; 
    string responseText; 
    TObjectType retVal; 

    // Obtain a string from the underlying response string 
    enc = UTF8Encoding.Default; 
    responseReader = new StreamReader(webResponse.GetResponseStream(), enc); 
    responseText = responseReader.ReadToEnd(); 

    // Use JSon to deserialise the string 
    retVal = JsonConvert.DeserializeObject<TObjectType>(responseText); 

    return retVal; 
} 

우리는 또한 이런 종류의 물건을 시도했지만 아무 소용이 : 어떤 도움이 많이 주시면 감사하겠습니다

private TObjectType DecodeResponse<TObjectType>(HttpWebResponse webResponse) 
{ 
    Encoding enc; 
    StreamReader responseReader; 
    string responseText; 
    TObjectType retVal; 
    char[] buffer; 
    int bufferSize, startPos, totalLength, readLength; 
    StringBuilder sbx; 

    // Obtain a string from the underlying response string 
    enc = UTF8Encoding.Default; 
    responseReader = new StreamReader(webResponse.GetResponseStream(), enc); 

    totalLength = (int)webResponse.ContentLength; 
    bufferSize = 65536; 
    startPos = 0; 
    buffer = new char[bufferSize]; 

    sbx = new StringBuilder(totalLength); 
    //webResponse.GetResponseStream(). 

    while (startPos < totalLength) 
    { 
    readLength = Math.Min(bufferSize, totalLength - startPos); 
    responseReader.Read(buffer, startPos, readLength); 
    sbx.Append(buffer, 0, readLength); 

    startPos += readLength; 
    } 

    //responseText = responseReader.ReadToEnd(); 
    responseText = sbx.ToString(); 

    // Use JSon to deserialise the string 
    retVal = JsonConvert.DeserializeObject<TObjectType>(responseText); 

    return retVal; 
} 

;-)

+0

귀하의 최종 코드로 시작하는 고장 - 그것은 * 가정 *'Read' 항상 많은 문자를 읽습니다 :

더 많은 정보가 필요합니다 사람의 경우에 참조하시기 바랍니다 그것은 요구된다. 그것을 가정하지 마십시오. –

+0

그래, 고마워. 문제가 발생한 곳을 진단하고 진단하기 위해 작성한 코드 일 뿐이야. 나는 HttpWebResponse가 64k에서 실패하고있는 것을 볼 수있다. 비록 더 많은 데이터를 사용할 수 있지만 (FireFox와 IE는 모두 데이터 전체를 반환한다.) –

답변

관련 문제