#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");
}