2013-02-04 35 views
14

Chúng tôi đang cố gắng trả lại các tệp hình ảnh lớn bằng ASP.Net WebApi và sử dụng mã sau để truyền các byte tới máy khách.Truyền hình ảnh lớn bằng ASP.Net Webapi

Mã trên hoạt động tốt nhưng một số tệp mà chúng tôi xử lý có thể có kích thước 2 GB trở lên dẫn đến thời gian chờ kết nối. Chúng tôi đã sử dụng mã tương tự như dưới đây trong quá khứ (bằng cách sử dụng HttpHandlers) để chunk các phản ứng với dòng phản ứng để giữ cho kết nối còn sống với thành công.

byte[] b = new byte[this.BufferChunkSize]; 
int byteCountRead = 0; 

while ((byteCountRead = stream.Read(b, 0, b.Length)) > 0) 
{ 
    if (!response.IsClientConnected) break; 

    response.OutputStream.Write(b, 0, byteCountRead); 
    response.Flush(); 
} 

Làm cách nào chúng ta có thể sử dụng kỹ thuật tương tự bằng mô hình lập trình WebAPI mới được hiển thị trước đó?

Cảm ơn bạn trước

Trả lời

26

Có, bạn có thể sử dụng PushStreamContent. Và nếu bạn kết hợp nó với việc thực thi không đồng bộ (ví dụ: async lambdas), bạn có thể nhận được kết quả thậm chí hiệu quả hơn.

Tôi đã viết blog về phương pháp này vào đầu tháng này - http://www.strathweb.com/2013/01/asynchronously-streaming-video-with-asp-net-web-api/.

Ví dụ sử dụng tệp video, nguyên tắc giống nhau - đẩy xuống byte dữ liệu cho khách hàng.

+0

@FIllip W - Trước hết, cảm ơn sự giúp đỡ của bạn rất nhiều. Tôi không có sự sang trọng của việc sử dụng 4.5 Framework vì vậy tôi không thể sử dụng các tính năng Async được xây dựng trong khung công tác 4.5. Cách tiếp cận này có thể làm việc với việc sử dụng các thư viện khung 4.0? Cụ thể hơn, hành động "WriteToStream" sẽ thay đổi như thế nào? Tôi có thể đọc từng đoạn byte và ghi vào luồng đầu ra mà không phải lo lắng về phần không đồng bộ không? – raj

+0

Có mọi thứ trong API Web 4.0 tương thích. Bạn có thể chỉ cần loại bỏ async/await và làm cho toàn bộ điều đồng bộ, hoặc chỉ sử dụng continuations (ContinueWith) bất cứ nơi nào mã được chờ đợi. –

+0

@FIllip W - Điều này hoạt động tốt cho tôi. Cảm ơn bạn rất nhiều vì đã giúp bạn một lần nữa. Tôi đã chấp nhận câu trả lời của bạn. Cảm ơn một lần nữa – raj

Các vấn đề liên quan