32

を介して画像を返す HttpHandler がありますResponse.OutputStream。次のコードがあります。

_imageProvider.GetImage().CopyTo(context.Response.OutputStream);

GetImage()メソッドは、Stream実際にはMemoryStreamインスタンスである a を返し、ブラウザに 0 バイトを返しています。GetImage()メソッド シグネチャを変更して a を返しMemoryStream、次のコード行を使用するとします。

_imageProvider.GetImage().WriteTo(context.Response.OutputStream);

それは機能し、ブラウザは画像を取得します。したがって、MemoryStream クラスの WriteTo と CopyTo の違いは何ですか。また、メソッド シグネチャStreamでクラスを使用してこれを機能させるための推奨される方法は何ですか。GetImage()

4

2 に答える 2

49

WriteTo()データをコピーする前に読み取り位置をゼロにリセットします-CopyTo()一方で、ストリーム内の現在の位置の後に残っているデータをコピーします。つまり、自分で位置をリセットしなかった場合、データはまったく読み取られません。

ほとんどの場合、最初のバージョンで次のことを見逃しているだけです。

memoryStream.Position = 0;
于 2012-05-18T21:18:03.667 に答える
11

リフレクターによると、これはCopyTo()メソッドの定義です。

private void InternalCopyTo(Stream destination, int bufferSize)
{
    int num;
    byte[] buffer = new byte[bufferSize];
    while ((num = this.Read(buffer, 0, buffer.Length)) != 0)
    {
        destination.Write(buffer, 0, num);
    }
}

ここには「残りのメカニズム」はありません...すべてthisを宛先にコピーします(バッファサイズのブロックで)。

于 2012-05-18T21:43:11.900 に答える