2013-05-03 16 views
5

Web APIを使用してアプリケーションにRESTfulなサービスを提供しています。現在のところWPFを使用しており、サービスクライアントが必要です。HttpWebRequest応答ストリームは64KBのデータしか返しません

レスポンスのサイズが64kを超えると、ContentLengthがより大きい(テストケースで〜125k)にもかかわらず、より多くのデータが要求されると、基本ストリームが64kで停止し、例外がスローされます。

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はどちらも完全なデータセットを返します)。 –

答えて

7

詳しい調査の結果、HttpWebRequestは静的プロパティを持っていることを明らかにしましたDefaultMaximumErrorResponseLengthと呼ばれ、デフォルトでは65536に設定されています。

.NETフレームワークにはこの悪意あるプロンプトが含​​まれていますrtyはあなたの応答がtext/plainである限り動作しますが、XMLやJSONなどのクロージャが必要な場合は破損します。