BinaryWrite exception “OutputStream is not available when a custom TextWriter is used” in MVC 2 ASP.NET 4

别说谁变了你拦得住时间么 提交于 2019-11-30 11:18:51

When a ViewPage begins executing, it assumes certain things about the remainder of the request. The particular thing that is tripping you up is that a ViewPage assumes that the remainder of the request will be a normal HTML or some other textual response, so it switches the response's TextWriter with its own writer.

In your case, you should make a new ActionResult-derived class whose ExecuteResult method encapsulates the logic in your Page_Load method. Your action method should return an instance of your custom class, and the invoker will run the ExecuteResult method at the appropriate time. This bypasses the view engines entirely, which prevents the error you're running in to and gives you a slight performance boost.

I did Levi's answer. It's actually super easy. My code writes an image to the response, which is previously gotten from the file system after various checks.

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

The line at the end of the controller just looks like this:

return new BookImageResult(graphicReport);

Someone mark Levi's response as the answer!

Another way to do something similar is to use the built-in File ActionResult:

var bytes = GetPdfBytes("Performance Report", htmlString);
return File(bytes, "binary/octet-stream", "Performance Report.pdf");
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!