2010-02-14 26 views
15

Tôi có chế độ xem hiển thị luồng bằng cách sử dụng phương thức BinaryWrite phản hồi. tất cả điều này đã làm việc tốt dưới ASP.NET 4 sử dụng Beta 2 nhưng ném ngoại lệ này trong phiên bản RC:Ngoại lệ BinaryWrite "OutputStream không khả dụng khi một TextWriter tùy chỉnh được sử dụng" trong MVC 2 ASP.NET 4

"HttpException", "OutputStream là không sẵn khi một TextWriter tùy chỉnh là sử dụng. "

<%@ Page Title="" Language="C#" Inherits="System.Web.Mvc.ViewPage" %> 
<%@ Import Namespace="System.IO" %> 
<script runat="server"> 
protected void Page_Load(object sender, EventArgs e) 
{ 
    if (ViewData["Error"] == null) 
    { 

     Response.Buffer = true; 
     Response.Clear(); 
     Response.ContentType = ViewData["DocType"] as string; 
     Response.AddHeader("content-disposition", ViewData["Disposition"] as string); 
     Response.CacheControl = "No-cache"; 
     MemoryStream stream = ViewData["DocAsStream"] as MemoryStream; 
     Response.BinaryWrite(stream.ToArray()); 
     Response.Flush(); 
     Response.Close(); 
    } 
} 
</script> 


</script> 

Quan điểm được tạo ra từ một chuyển hướng phía khách hàng (jquery thay thế cuộc gọi vị trí trong trang trước sử dụng Url.Action helper để làm cho liên kết tất nhiên). Đây là tất cả trong một khung nội tuyến.

Bất kỳ ai cũng có ý tưởng tại sao điều này xảy ra?

Trả lời

16

Khi ViewPage bắt đầu thực thi, nó giả định một số điều nhất định về phần còn lại của yêu cầu. Điều đặc biệt là vấp ngã bạn là ViewPage giả định rằng phần còn lại của yêu cầu sẽ là một HTML bình thường hoặc một số phản ứng văn bản khác, do đó, nó chuyển TextWriter của phản hồi bằng chính tác giả của nó.

Trong trường hợp của bạn, bạn nên tạo một lớp ActionResult có nguồn gốc mới có phương thức ExecuteResult đóng gói logic trong phương thức Page_Load của bạn. Phương thức hành động của bạn sẽ trả về một thể hiện của lớp tùy chỉnh của bạn và người invoker sẽ chạy phương thức ExecuteResult vào thời điểm thích hợp. Điều này bỏ qua các công cụ xem hoàn toàn, giúp ngăn chặn lỗi bạn đang chạy vào và mang đến cho bạn hiệu suất tăng nhẹ.

+2

Đây là câu trả lời đúng –

10

Tôi đã trả lời của Levi. Nó thực sự siêu dễ dàng. Mã của tôi viết một hình ảnh cho phản hồi, mà trước đó đã nhận được từ hệ thống tệp sau khi kiểm tra khác nhau.

public class BookImageResult : ActionResult 
{ 
    private readonly GraphicReport graphicReport; 

    public BookImageResult(GraphicReport graphicReport) 
    { 
     this.graphicReport = graphicReport; 
    } 

    public override void ExecuteResult(ControllerContext context) 
    { 
     var response = context.RequestContext.HttpContext.Response; 
     response.Clear(); 
     response.ContentType = graphicReport.ContentType; 
     response.BinaryWrite(graphicReport.Image); 
     response.End(); 
    } 
} 

Dòng ở phần cuối của bộ điều khiển chỉ trông như thế này: phản ứng đánh dấu

return new BookImageResult(graphicReport); 

người Levi như câu trả lời!

+2

Cám ơn một thêm một mẫu mã. –

+0

Còn về biểu mẫu web thì sao? Tôi đang cố gắng sử dụng reportviewer. trong phương thức tải trang. – JoshYates1980

2

Một cách khác để làm điều gì đó tương tự là sử dụng được xây dựng trong FileActionResult:

var bytes = GetPdfBytes("Performance Report", htmlString); 
return File(bytes, "binary/octet-stream", "Performance Report.pdf"); 
Các vấn đề liên quan