2014-06-24 5 views
1

Я хочу, чтобы сгенерировать PDF, и я использую следующий код в моем контроллере, чтобы назвать его:ASP.NET MVC с пользовательским ActionResult: OutputStream не доступен, когда обычай TextWriter используется

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, поэтому я сделал это без успеха.

Что не так?

+0

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

+0

@dotnetstep Я пытался, ту же ошибку. – PoeHaH

+0

Вместо контекста. HttpContext.Response попробуйте HttpContext.Current.Response. – dotnetstep

ответ

2

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

Кроме того, ваш PdfActionResult перемешивает две проблемы здесь,() создание данных PDF и(), крепящие его к ответу. Основная проблема 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"); 
}