0

HttpWebResponse オブジェクトから応答ストリームを読み取ろうとしています。ストリームの長さ (_response.ContentLength) はわかっていますが、次の例外が引き続き発生します。

指定された引数は有効な値の範囲外です。パラメータ名:サイズ

デバッグ中に、エラーの時点で値が次のようになっていることに気付きました。

length = 15032 //_response.ContentLength で定義されたストリームの長さ

bytesToRead = 7680 //まだ読み取る必要があるストリーム内のバイト数

bytesRead = 7680 //読み取られたバイト数 (オフセット)

body.length = 15032 //ストリームがコピーされる byte[] のサイズ

奇妙な点は、ストリームのサイズ (長さ変数に含まれる) に関係なく、bytesToRead 変数と bytesRead 変数が常に 7680 であることです。何か案は?

コード:

int length = (int)_response.ContentLength;

byte[] body = null;

if (length > 0)
{
    int bytesToRead = length;
    int bytesRead = 0;

    try
    {
        body = new byte[length];

        using (Stream stream = _response.GetResponseStream())
        {
            while (bytesToRead > 0)
            {                                                        
                // Read may return anything from 0 to length.
                int n = stream.Read(body, bytesRead, length);

                // The end of the file is reached.
                if (n == 0)
                    break;

                bytesRead += n;
                bytesToRead -= n;
            }
            stream.Close();
        }
    }
    catch (Exception exception)
    {
        throw;
    }   
}
else
{
    body = new byte[0];
}

_responseBody = body;
4

1 に答える 1

2

この行が必要です:

int n = stream.Read(body, bytesRead, length);

これになる:

int n = stream.Read(body, bytesRead, bytesToRead);

読み取る最大バイト数はストリームの長さだと言っていますが、実際にはオフセットが適用された後のストリーム内の残りの情報のみであるため、そうではありません。

この部分も必要ありません。

if (n == 0)
   break;

while は読み取りを正しく終了する必要があり、すべてを完了する前にバイトを読み取らない可能性があります (ストリームからデータを取得するよりもストリームがいっぱいになるのが遅い場合)。

于 2010-05-19T15:35:33.767 に答える