2015-01-20 15 views
5

Tarzlaşmış bir HTML dosyasını bir PDF'ye dönüştüren bir Web API'si oluşturmaya çalışıyorum.İlk dönüşümden sonra HangingPechkin'i Asılı

TuesPechkin kullanıyorum ve uygulamamı IIS'ye yükledim (32-bit bir uygulama olarak: uygulama havuzunu 32bit modunda çalışacak şekilde değiştirdim).

IIS 8.5, Windows Server 2012 R2 üzerinde çalışıyor. C#

PDFConversion sınıfı:

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(); 
     } 
    } 
} 

Kontrolör aşağıdaki gibidir: bir kere bir dosya gönderme Fiddler'da deneme PDF dönecektir hemen: bu biraz garip olur nerede

İşte
[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; 
    } 

var . Bununla birlikte, sonraki tüm POST'ler Fiddler'ın asılı kalmasını sağlayacaktır. Görev Yöneticisi incelendiğinde, bu görev için CPU ve Bellek sırasıyla% 13.5 ve ~ 96MB'ye kadar atlama gösterir.

Temp klasöründe (dosyaların depolandığı yer), başarılı bir şekilde, üç dosyada olacaktır: orijinal yüklenen dosya (GUID benzeri bir adla depolanır), wkHtmlToPdf ile oluşturulan dosya (formda "wktemp-") ve oluşturulan pdf (tempXXXX.pdf olarak). Asılı durumda, yalnızca ilk dosya bulunabilir, bu da sorunun wkHtmlToPdf'nin kendisinde olduğunu gösterir.

Ancak gerçek şikâyetçi süreç el Görev Yöneticisi öldürülünce , API başarıyla tamamlar olduğunu pdf, tamamen yaratılan döner!

IIS sıfırlanırsa, işlem özgün durumuna döner; Yeni bir girişim, sorunsuz bir şekilde çalışacaktır.

Bu bir hata mı ... Açıkçası, her görüşmeden sonra IIS sıfırlama pek yaşayabilir, ne de el işlemini her zaman öldürüyor/bu konuya herhangi çözümleri vardır?

+1

görünüyor asılı önleyecektir . – tuespetre

+0

Evet, bu benim sorunumu çözdü, teşekkürler! Ayrıca dönüştürücüyü işlevden çıkardım ve statik hale getirdim. –

cevap

0

WkHtmlToPdf 64 bit kullanıyorsunuz ve 32 bit bir tane kurduysanız.

değiştirebilir olmalıdır:

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

için
 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(); 

Boşaltma remotingToolset Eğer `` ThreadSafeConverter` StandardConverter` yerine kullandığınız gibi RemotingToolset.Unload();

+1

Bu, benim için çözüldü (64 bit dağıtımı kullanarak). Dönüştürücü bunu aşmak için bir seçeneğe sahip olmalıdır. Ama kabul edilebilir. Teşekkürler! – TravisWhidden

+0

Bu benim için WinAnyCPUEmbeddedDeployment kullanarak da çalıştı. – noCodeMonkeys