2015-01-20 17 views
5

Tôi đang cố gắng tạo một API Web có thể chuyển đổi tệp HTML được tạo kiểu thành một tệp PDF.Treo ThirdPechkin sau khi chuyển đổi ban đầu

Tôi đang sử dụng TuesPechkin và đã cài đặt ứng dụng của mình vào IIS (dưới dạng ứng dụng 32 bit: Tôi đã sửa đổi nhóm ứng dụng để chạy ở chế độ 32 bit).

IIS 8.5 đang chạy trên Windows Server 2012 R2.

lớp PDFConversion trong C#:

using System.Drawing.Printing; 
using System.IO; 
using TuesPechkin; 

namespace PDFApi 
{ 
    public class PDFcreator 
    { 
     public void convert(string path, string uri) 
     { 
      IConverter converter = new StandardConverter(
       new RemotingToolset<PdfToolset>(
        new Win64EmbeddedDeployment(
        new TempFolderDelpoyment()))); 

      var document = new HtmlToPdfDocument 
      { 
       GlobalSettings = 
       { 
        ProduceOutline = true, 
        DocumentTitle = "Converted Form", 
        PaperSize = PaperKind.A4, 
        Margins = 
        { 
         All = 1.375, 
         Unit = Unit.Centimeters 
        } 
       }, 
       Objects = 
       { 
        new ObjectSettings { RawData = File.ReadAllBytes(uri) } 
       } 
      }; 

      byte[] pdfBuf = converter.Convert(document); 

      FileStream fs = new FileStream(path, FileMode.Create); 
      fs.Write(pdfBuf, 0, pdfBuf.Length); 
      fs.Close(); 
     } 
    } 
} 

Controller như sau:

[Route("converthtml")] 
    [HttpPost] 
    [MIMEContentFilter] 
    public async Task<HttpResponseMessage> ConvertHtml() 
    { 
     string temppath = System.IO.Path.GetTempPath(); 

     var streamProvider = new MultipartFormDataStreamProvider(temppath); 
     await Request.Content.ReadAsMultipartAsync(streamProvider); 


     string filepath = streamProvider.FileData.Select(entry => entry.LocalFileName.Replace(temppath + "\\", "")).First<string>(); 
     string pdfpath = System.IO.Path.GetTempFileName(); 
     pdfpath = pdfpath.Substring(0, pdfpath.LastIndexOf('.')) + ".pdf"; 

     new PDFcreator().convert(pdfpath, filepath); 

     var stream = new FileStream(pdfpath, FileMode.Open); 
     var result = new HttpResponseMessage(HttpStatusCode.OK); 
     result.Content = new StreamContent(stream); 
     result.Content.Headers.ContentType = new MediaTypeHeaderValue("application/pdf"); 
     return result; 
    } 

Đây là nơi nó được một chút lẻ: Thử nghiệm trong Fiddler, gửi một tập tin một lần sẽ trở lại với PDF ngay lập tức . Tuy nhiên, tất cả các POST tiếp theo sẽ để lại Fiddler treo. Kiểm tra Trình quản lý tác vụ hiển thị CPU và Bộ nhớ cho tác vụ này để tăng lên đến 13,5% và ~ 96MB tương ứng.

Thư mục tạm thời (nơi tệp được lưu trữ), khi chạy thành công, sẽ có ba tệp trong đó: tệp được tải lên ban đầu (được lưu trữ với tên giống GUID), tệp được tạo qua wkHtmlToPdf (trong biểu mẫu "wktemp-") và pdf được tạo (dưới dạng tempXXXX.pdf). Trong trường hợp treo, chỉ có thể tìm thấy tệp đầu tiên, cho biết rằng sự cố ở đâu đó trong chính wkHtmlToPdf.

Tuy nhiên, trình phát thực sự là khi quá trình này bị giết thủ công trong Trình quản lý tác vụ, API hoàn tất thành công, trả về bản pdf, được tạo hoàn toàn!

Nếu IIS được đặt lại, quá trình trở về trạng thái ban đầu; một nỗ lực mới sẽ hoạt động mà không có vấn đề gì.

Rõ ràng, đặt IIS sau mỗi cuộc gọi là khó khả thi, cũng không phải là tay giết chết quá trình này mỗi lần ...

Đây có phải là một lỗi/có bất kỳ giải pháp cho vấn đề này?

+1

Dường như bạn đang sử dụng 'StandardConverter' thay vì' ThreadSafeConverter' . – tuespetre

+0

Có, điều này đã giải quyết được vấn đề của tôi, cảm ơn! Tôi cũng chuyển bộ chuyển đổi ra khỏi chức năng và làm cho nó tĩnh. –

Trả lời

0

Có vẻ như bạn đang sử dụng WkHtmlToPdf 64 bit và bạn đã cài đặt 32 bit một.

Bạn nên thay đổi:

 IConverter converter = new StandardConverter(
      new RemotingToolset<PdfToolset>(
       new Win64EmbeddedDeployment(
       new TempFolderDelpoyment()))); 

để

 IConverter converter = new StandardConverter(
      new RemotingToolset<PdfToolset>(
       new Win32EmbeddedDeployment(
       new TempFolderDelpoyment()))); 
4
  var tempFolderDeployment = new TempFolderDeployment(); 
      var win32EmbeddedDeployment = new Win32EmbeddedDeployment(TempFolderDeployment); 
      var remotingToolset = new RemotingToolset<PdfToolset>(Win32EmbeddedDeployment); 

      var converter = 
       new ThreadSafeConverter(RemotingToolset); 


      byte[] pdfBuf = converter.Convert(document); 
      remotingToolset.Unload(); 

Unload remotingToolset sẽ ngăn treo RemotingToolset.Unload();

+1

Điều này đã giải quyết cho tôi (sử dụng triển khai 64 bit). Trình chuyển đổi phải có tùy chọn để chuyển xuống. Nhưng chấp nhận được. Cảm ơn! – TravisWhidden

+0

Điều này làm việc cho tôi cũng như sử dụng WinAnyCPUEmbeddedDeployment. – noCodeMonkeys

Các vấn đề liên quan