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;
}
;-)
あなたの最終的なコードがで開始する壊れている - それは*を前提と* 'Read'はいつものように多くの文字を読み取っていること:
より多くの情報を必要とする誰のために参照してください。それは頼まれている。それを仮定しないでください。 –
ええ、ありがとう - それは問題が発生していた場所を試して診断するために書いたコードです。私はHttpWebResponseが64kで失敗しているのを見ることができますが、それ以上のデータがあるにもかかわらず(FireFoxとIEはどちらも完全なデータセットを返します)。 –