2013-05-03 3 views
5

हम अपने एप्लिकेशन को एक विश्वसनीय सेवा प्रदान करने के लिए वेब एपीआई का उपयोग कर रहे हैं, जो फिलहाल WPF का उपयोग कर रहा है और इसलिए एक सेवा क्लाइंट की आवश्यकता है।HttpWebRequest प्रतिक्रिया स्ट्रीम केवल 64k डेटा लौटाता है

हमारे पास समस्या यह है कि जब प्रतिक्रिया आकार 64k से अधिक हो जाता है, तो अंतर्निहित धारा 64k पर बंद हो जाती है और यदि डेटा लम्बाई अधिक है (परीक्षण मामले ~ 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 पर विफल रहा है, भले ही वहां अधिक डेटा उपलब्ध है (फ़ायरफ़ॉक्स और आईई दोनों डेटा का पूरा सेट लौटाते हैं)। –

उत्तर

7

आगे की जांच से पता चला कि HttpWebRequest एक स्थिर संपत्ति है DefaultMaximumErrorResponseLength कहा जाता है जो डिफ़ॉल्ट रूप से 65536 पर सेट किया जाता है।

यह दावा करेगा कि .NET ढांचे में इस तेज प्रोपे आरटीआई जो तब तक काम करता है जब तक आपकी प्रतिक्रिया टेक्स्ट/सादा होती है, लेकिन अगर इसे किसी भी बंद करने की आवश्यकता होती है - जैसे एक्सएमएल या जेएसओएन - यह टूट जाता है।

सभी लोग जिनके बारे में अधिक जानकारी की जरूरत है के लिए, कृपया उल्लेख करने के लिए:

संबंधित मुद्दे