Исключение BinaryWrite “OutputStream не доступно, когда пользовательский TextWriter используется” в MVC 2 ASP.NET 4

У меня есть представление, представляющее поток с помощью ответа метод BinaryWrite. Это все хорошо работало в соответствии с ASP.NET 4 использования Беты 2, но выдает это исключение в выпуске RC:

"HttpException", "OutputStream не доступен, когда пользовательский TextWriter используется".

<%@ 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>

Представление сгенерировано от перенаправления на стороне клиента (вызов местоположения замены jQuery в предыдущей странице с помощью URL. Помощник действия для рендеринга ссылки, конечно). Это - все в iframe.

У кого-либо есть идея, почему это происходит?

17
задан Eduardo Molteni 16 April 2010 в 12:49
поделиться

2 ответа

В своем блоге я подробно описал метод обработки этого, который функционирует так же, как и в Ruby on Rails. Вы можете найти ссылку в нижней части поста, но вот образец конечного результата:

public ActionResult Index()
{
    return RespondTo(format =>
    {
        format.Html = () => View();
        format.Json = () => Json(new { message = "hello world" });
    });
}

Вот ссылка на пост: http://icanhascode.com/2009/05/simple-ror-respond_to-functionality-in-aspnet-mvc/

Он может обрабатывать обнаружение правильного типа через заголовки HTTP, а также переменные в маршруте.

-121--2970372-

Ничего эффектного, но подумал, что это может помочь другим. Хотя вы можете написать сценарий оболочки, чтобы сделать это легко, этот один-лайнер, возможно, проще:

grep -lr -e '<searchthis>' * | xargs sed -i 's/<searchthis>/<replacewith>/g'
-121--2910294-

Когда ViewPage начинает выполнение, он предполагает определенные вещи об оставшейся части запроса. Конкретная вещь, которая приводит вас в действие, заключается в том, что ViewPage предполагает, что оставшаяся часть запроса будет обычным HTML или каким-либо другим текстовым ответом, поэтому он переключает TextWriter ответа на собственный модуль записи.

В данном случае необходимо создать новый производный от ActionResult класс, чей метод ExecureResult инкапсулирует логику в Page_Load метод. Метод действия должен возвращать экземпляр пользовательского класса, и инициатор выполнит метод ExecureResult в соответствующее время. Это полностью обходит механизмы просмотра, что предотвращает ошибку, с которой вы работаете, и обеспечивает небольшое повышение производительности.

17
ответ дан 30 November 2019 в 12:35
поделиться

Я сделал ответ Леви. На самом деле это очень просто. Мой код записывает в ответ изображение, которое предварительно получено из файловой системы после различных проверок.

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

Строка в конце контроллера выглядит так:

return new BookImageResult(graphicReport);

Кто-нибудь, отметьте ответ Леви как ответ!

11
ответ дан 30 November 2019 в 12:35
поделиться
Другие вопросы по тегам:

Похожие вопросы: