2013-05-03 6 views
5

Wir verwenden die Web-API, um einen REST-fähigen Dienst für unsere Anwendung bereitzustellen, die derzeit WPF verwendet und dafür einen Dienst-Client benötigt.HttpWebRequest Antwort-Stream gibt nur 64.000 Daten zurück

Das Problem, das wir haben, ist, dass, wenn die Antwortgröße 64k überschreitet, der zugrunde liegende Stream bei 64k endet und eine Ausnahme auslöst, wenn mehr Daten angefordert werden, obwohl ContentLength größer ist (im Testfall ~ 125k)

hier ist unsere Methode, die den Dienst aufruft:

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; 
} 

... und hier ist eine Methode, die in der Antwort, mit einem Tropfen Klebstoff Logik decodiert zwischen, dass die Reaktion durchläuft.

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; 
} 

Wir haben auch diese Art der Sache versucht, aber ohne Erfolg:

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; 
} 

Jede mögliche Hilfe würde viel ;-)

+0

Ihre endgültige Code gebrochen wird, mit zu beginnen - es * geht davon aus, dass * 'Read' immer so viele Zeichen lautet wie es ist gefragt. Nimm das nicht an. –

+0

Ja danke - es war nur Code, den ich schrieb, um zu versuchen und zu diagnostizieren, wo das Problem auftrat. Ich kann sehen, dass die HttpWebResponse bei 64k fehlschlägt, obwohl viel mehr Daten verfügbar sind (FireFox und IE beide geben den vollständigen Datensatz zurück). –

Antwort

7

Weitere Untersuchungen haben ergeben, erkannt werden, dass HttpWebRequest eine statische Eigenschaft hat DefaultMaximumErrorResponseLength genannt, die standardmäßig auf 65536 eingestellt ist.

Es würde konspirieren, dass das .NET-Framework dieses teuflische Projekt enthält Es funktioniert so lange, wie Ihre Antwort Text/Ebene ist, aber wenn es eine Schließung erfordert - wie XML oder JSON - bricht es.

Für alle, die mehr Informationen benötigt, lesen Sie bitte: