У меня есть представление, представляющее поток с помощью ответа метод 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.
У кого-либо есть идея, почему это происходит?
В своем блоге я подробно описал метод обработки этого, который функционирует так же, как и в 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 в соответствующее время. Это полностью обходит механизмы просмотра, что предотвращает ошибку, с которой вы работаете, и обеспечивает небольшое повышение производительности.
Я сделал ответ Леви. На самом деле это очень просто. Мой код записывает в ответ изображение, которое предварительно получено из файловой системы после различных проверок.
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);
Кто-нибудь, отметьте ответ Леви как ответ!