CoolUtils TotalPDFPrinterX导致ASP C#站点崩溃

时间:2016-05-20 13:07:09

标签: c# asp.net asp.net-mvc asp.net-web-api pdf-generation

我公司从https://www.coolutils.com/TotalPDFPrinterX

购买了CoolUtils TotalPDFPrinterX

我从Postman向API发出HTTP PUT,我得到“无法得到任何回复”。

Could not get any response

在我的Windows机器上运行时,PDF打印正常,但是在服务器上网站崩溃,在事件日志中我收到错误“进程服务应用程序池'[MY_APP_POOL]'无法响应ping。进程ID是'[MY_PROCESS_ID]'。“

A process serving application pool '[MY_APP_POOL]' failed to respond to a ping

这是我的C#代码:

PDFPrinterX ppx = new PDFPrinterX();
ppx.Print(fileName, printerName, "-ap Default");
if (ppx.ErrorMessage != null)
{
    WriteToSQL(id, false, ppx.ErrorMessage, 2);
    Console.WriteLine(ppx.ErrorMessage);
}

通过写入事件日志,我知道网站在此行崩溃:PDFPrinterX ppx = new PDFPrinterX();我还用try catch包围了上面的代码,并且没有抛出任何异常。该网站仍然崩溃。

我尝试过的事情:

  • 卸载并重新安装CoolUtils软件
  • 给每个人完全控制站点文件夹和CoolUtils程序文件夹
  • 使用相同的代码创建C#桌面应用程序。这项工作在服务器上很精细。这只是崩溃的ASP网站。

有谁知道可能导致这种情况的原因?

2 个答案:

答案 0 :(得分:1)

我越是在网上研究这个问题,我越倾向于说ActiveX X PDFPrinterX TotalPDFPrinterX }在IIS中托管时运行良好。

我见过几个论坛,他们说当它们在localhost上调试时工作正常,但是当部署到服务器时崩溃了。

  

...在localhost(Visual Studio)中使用时工作正常

其中一个功能页面显示它需要Win 2000 / NT / XP / 2003 / Vista / 7

您应该查看您的服务器是否支持可与IIS结合使用的ActiveX组件。

查看其他产品支持页面之一:TotalPDFConverterX

我认为以下注释也可能适用于Subprogram = Popen(['lxterminal', '-e', 'python ./Foo.py'], stdout=PIPE),因为它也依赖于ActiveX。

  

注意:安装期间请注意一些细节Total PDF Converter X:

     
      
  • 不要忘记在您的网络服务器帐户中注册ActiveX。
  •   
  • Total PDF Converter X仅支持Internet Explorer,Mozilla和Firefox浏览器。
  •   
  • ActiveX仅适用于32位Internet信息服务器。不支持64位服务器。请改用命令行版本。
  •   

答案 1 :(得分:1)

感谢@Nkosi,我找到了解决方法。

  

ActiveX仅适用于32位Internet信息服务器。不支持64位服务器。请改用命令行版本。

我们的IIS服务器是64位,这可能导致网站挂起。

Buttt ......命令行仍然可以在服务器上打印PDF。

客户端代码(进行HTTP POST):

private void SendToPrinter(string fileName, string printerName, int id, decimal documentSequence)
{
    // use http client to make a POST to the print api
    using (var client = new HttpClient())
    {
        // compile the values string to transfer in POST
        // should finish to look something like this:
        // C:\print.pdf&PRTFTW_OFIT&ValShip-155320-1
        var values = new Dictionary<string, string>
        {
            { "", fileName + "&" + printerName + "&ValShip-" + id + "-" + documentSequence},
        };

        // URL encode the values string
        var content = new FormUrlEncodedContent(values);

        // make the POST

        // DEBUG
        var response = client.PostAsync("http://localhost:54339/api/print", content);

        // retrieve the response
        var responseString = response.Result.ToString();
    }

}

服务器端代码(接收HTTP POST):

using System;
using System.Net.Http;
using System.Web;
using System.Web.Http;

namespace api.valbruna.print.Controllers
{
    public class PrintController : ApiController
    {
        // POST api/print
        public HttpResponseMessage Post(HttpRequestMessage request)
        {
            try
            {
                // parse the content recieved from the client
                var content = request.Content.ReadAsStringAsync().Result;

                // decode the content, certain characters such as 
                // '&' get encoded to URL lingo such as '%26'
                content = HttpUtility.UrlDecode(content);

                // split the string into 3 seperate parts
                String[] str = content.Split('&');

                // remove the equal sign from the first string
                str[0] = str[0].Trim('=');

                // compile the arguments command line string
                // should finish to look something like this:
                // "C:\Program Files (x86)\CoolUtils\Total PDF PrinterX\PDFPrinterX.exe" "C:\print.pdf" -p"\\PRINTERS\PRTFTW_OFIT" -ap Default -log "C:\inetpub\logs\CoolUtils\log-ValShip-155320-4.txt" -verbosity detail"
                String arguments = "\"" + str[0] + "\" -p\"\\\\PRINTERS\\" + str[1] +
                                   "\" -ap Default -log \"C:\\inetpub\\logs\\CoolUtils\\log-" + str[2] +
                                   ".txt\" -verbosity detail";

                // file location for PDFPrinterX.exe
                String file = @"C:\Program Files (x86)\CoolUtils\Total PDF PrinterX\PDFPrinterX.exe";

                // start the process
                System.Diagnostics.Process process = new System.Diagnostics.Process();
                System.Diagnostics.ProcessStartInfo startInfo = new System.Diagnostics.ProcessStartInfo();
                startInfo.WindowStyle = System.Diagnostics.ProcessWindowStyle.Normal;
                startInfo.FileName = file;
                startInfo.Arguments = arguments;
                process.StartInfo = startInfo;
                process.Start();

                return new HttpResponseMessage() { Content = new StringContent(content) };
            }
            catch (Exception e)
            {
                return new HttpResponseMessage() { Content = new StringContent(e.Message) };
            }
        }
    }
}