ASP.NET MVC с пользовательским actionresult: OutputStream недоступен при использовании пользовательского TextWriter

#c# #asp.net-mvc #actionresult

#c# #asp.net-mvc #actionresult

Вопрос:

Я хочу сгенерировать PDF-файл и использую следующий код в своем контроллере для его вызова:

 public PdfActionResult Index()
{
   return new PdfActionResult("");
}
  

пользовательский actionresult ‘pdfActionResult’ выглядит следующим образом:

  public override void ExecuteResult(ControllerContext context)
        {
            var _pdfConverter = new PdfConverter { MediaType = "Print" };
            var response = context.HttpContext.Response;
            response.Clear();
            response.AddHeader("Content-Type", "application/pdf");
            response.AddHeader("Content-Disposition", String.Format("{0}; filename={1}.pdf;", true ? "attachment" : "inline", "bla"));
            var z = context.HttpContext.Request.Url.AbsoluteUri;
            z = z.Substring(0, z.IndexOf("?", System.StringComparison.Ordinal));
            var b = _pdfConverter.GetPdfBytesFromUrl(z);
            response.OutputStream.Write(b,0,b.Length);
            response.Close();
            response.Flush();
            response.End();
        }
  

Я получаю следующее исключение:

 System.Web.HttpException: OutputStream is not available when a custom TextWriter is used.
  

Я читал другие сообщения SO, в которых предлагается использовать пользовательский actionresult, поэтому я сделал это, но безуспешно.

Что не так?

Комментарии:

1. Попробуйте использовать Response . BinaryWrite

2. @dotnetstep Я пробовал, та же ошибка.

3. Вместо context.HttpContext.Response попробуйте HttpContext.Current. Ответ.

4. @dotnetstep также не работает:(даже в сочетании с BinaryWrite() .

Ответ №1:

Я не вижу никаких причин для создания пользовательского ActionResult в этом случае. Возврат данных PDF — очень распространенная задача, и наиболее разумный способ сделать это — использовать встроенный FileResult .

Кроме того, здесь вы PdfActionResult смешиваете две проблемы: (1) создание данных PDF и (2) прикрепление их к ответу. Основная проблема an ActionResult заключается в том, как доставить ресурс, созданный действием, клиенту, а не генерировать сам ресурс.

Попробуйте это вместо:

 public FileResult Index()
{
    var _pdfConverter = new PdfConverter { MediaType = "Print" };
    var url = Request.Url.AbsolutePath;
    var pdfBytes = _pdfConverter.GetPdfBytesFromUrl(url);

    return File(pdfBytes, "application/pdf", "bla.pdf");
}