2013-03-09 2 views
3

Я пытаюсь создать PDF, он отлично работает в разработке, но не на моем рабочем сервере. Я предполагаю, что это права. Ошибка, которую я получаю:Значение не может быть пустым с wkhtmltopdf в MVC 4

Значение не может быть пустым. Имя параметра: fileContents

Я предполагаю, что говорит об этом fileContents пары:

System.Web.Mvc.Controller.File(Byte[] fileContents, String contentType, String fileDownloadName) +28 

Код для метода:

public ActionResult Pdf(Guid id, string filename) 
    { 
     string url = Url.Action("RenderReport", "TitleSearchReport", new { id = id }, "http"); 

     var file = WKHtmlToPdf(url); 

     return File(file, "application/pdf", Server.UrlEncode(filename)); 
    } 

код, который генерирует файл является:

public byte[] WKHtmlToPdf(string url) 
    { 
     var fileName = " - "; 
     //var wkhtmlDir = "C:\\Program Files\\wkhtmltopdf\\"; 
     //var wkhtml = "C:\\Program Files\\wkhtmltopdf\\wkhtmltopdf.exe"; 
     var wkhtmlDir = HttpContext.Server.MapPath(@"~/wkhtmltopdf"); 
     var wkhtml = HttpContext.Server.MapPath(@"~/wkhtmltopdf/wkhtmltopdf.exe"); 
     var p = new Process(); 

     p.StartInfo.CreateNoWindow = true; 
     p.StartInfo.RedirectStandardOutput = true; 
     p.StartInfo.RedirectStandardError = true; 
     p.StartInfo.RedirectStandardInput = true; 
     p.StartInfo.UseShellExecute = false; 
     p.StartInfo.FileName = wkhtml; 
     p.StartInfo.WorkingDirectory = wkhtmlDir; 

     string switches = ""; 
     switches += "--print-media-type "; 
     switches += "--margin-top 10mm --margin-bottom 10mm --margin-right 10mm --margin-left 10mm "; 
     switches += "--page-size Letter "; 
     p.StartInfo.Arguments = switches + " " + url + " " + fileName; 
     p.Start(); 

     //read output 
     byte[] buffer = new byte[32768]; 
     byte[] file; 
     using (var ms = new MemoryStream()) 
     { 
      while (true) 
      { 
       int read = p.StandardOutput.BaseStream.Read(buffer, 0, buffer.Length); 

       if (read <= 0) 
       { 
        break; 
       } 
       ms.Write(buffer, 0, read); 
      } 
      file = ms.ToArray(); 
     } 

     // wait or exit 
     p.WaitForExit(60000); 

     // read the exit code, close process 
     int returnCode = p.ExitCode; 
     p.Close(); 

     return returnCode == 0 ? file : null; 
    } 

Снова он работает p когда я отлаживаю, но не при развертывании. Что я могу сделать, чтобы сделать эту работу по производству?

Спасибо за ваш совет.

Edit:

Изменено мой метод, но теперь все это я получаю пустую страницу ...

public void Pdf(Guid id, string filename) 
    { 
     string url = Url.Action("RenderReport", "TitleSearchReport", new { id = id }, "http"); 

     var file = WKHtmlToPdf(url); 

     if (file != null) 
     { 
      Response.ContentType = "Application/pdf"; 
      Response.BinaryWrite(file); 
      Response.End(); 
     } 
    } 
+0

Вы проверили содержимое 'fileContents' после' var file = WKHtmlToPdf (url); '? –

+0

Я не уверен, как проверить это на производстве. Я изменил свой код (как показано выше), но теперь все, что я получаю, это пустая страница (без ошибок, просто пустая белая страница)! – user1477388

+0

Возможно, используя журнал? –

ответ

0

Решение было применить разрешения на чтение и запись в мой корень для сетевой пользователь. Не уверены в значениях безопасности ...

Смежные вопросы