2012-05-18 37 views
24

Tôi có một HttpHandler trả về một hình ảnh qua Response.OutputStream. Tôi có đoạn mã sau:Sự khác biệt giữa Stream.CopyTo và MemoryStream.WriteTo

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

GetImage() phương thức trả về một Stream mà thực sự là một trường hợp MemoryStream và nó được trở về 0 byte cho trình duyệt. Nếu tôi thay đổi GetImage() phương pháp chữ ký để trả về một MemoryStream và sử dụng các dòng mã sau đây:

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

Nó hoạt động và trình duyệt được một hình ảnh. Vì vậy, sự khác biệt giữa WriteTo và CopyTo trong lớp MemoryStream là gì và cách được khuyến nghị để thực hiện điều này là gì bằng cách sử dụng lớp Stream trong chữ ký phương thức GetImage().

Trả lời

38

WriteTo() đang đặt lại vị trí đã đọc về 0 trước khi sao chép dữ liệu - Mặt khác sẽ sao chép bất kỳ dữ liệu nào vẫn còn sau vị trí hiện tại trong luồng. Điều đó có nghĩa là nếu bạn không tự đặt lại vị trí, thì sẽ không có dữ liệu nào được đọc.

Nhiều khả năng bạn chỉ bỏ lỡ những điều sau đây trong phiên bản đầu tiên của bạn:

memoryStream.Position = 0; 
+1

tôi nghĩ copyTo đang giữ nguồn trong khi writeto isnt. –

+5

bạn đã nhận thông tin đó ở đâu? bạn có thể vui lòng cung cấp liên kết? –

+0

Tôi muốn tế bào thần kinh của não có một liên kết có thể truy cập công cộng. – viento

9

Theo phản xạ, đây là CopyTo() phương pháp định nghĩa:

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

Tôi không thấy bất kỳ "vẫn còn cơ chế "ở đây ... Nó sao chép mọi thứ từ this đến đích (trong khối kích thước bộ đệm).

+0

@nonnb in màn hình? tài liệu ? –

+0

xin lỗi, xin vui lòng bỏ qua bình luận của tôi - sai lầm của tôi - Tôi đã sao chép giữa 2 dòng phim và quên tua lại một trong các luồng trước khi gọi CopyTo. CopyTo hoạt động như bạn + BrokenGlass đã mô tả – StuartLC

+4

Chỉ để giữ cho trang nhất quán: phương thức _IternalCopyTo_ mô tả _Reads_ từ luồng hiện tại vào bộ đệm - đọc bắt đầu từ vị trí hiện tại của luồng (chỉ số và tham số offset là chỉ số và bù trong bộ đệm) - đó là "cơ chế còn lại" –