我公司从https://www.coolutils.com/TotalPDFPrinterX
购买了CoolUtils TotalPDFPrinterX我从Postman向API发出HTTP PUT,我得到“无法得到任何回复”。
在我的Windows机器上运行时,PDF打印正常,但是在服务器上网站崩溃,在事件日志中我收到错误“进程服务应用程序池'[MY_APP_POOL]'无法响应ping。进程ID是'[MY_PROCESS_ID]'。“
这是我的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包围了上面的代码,并且没有抛出任何异常。该网站仍然崩溃。
我尝试过的事情:
有谁知道可能导致这种情况的原因?
答案 0 :(得分:1)
我越是在网上研究这个问题,我越倾向于说ActiveX
X
PDFPrinterX
TotalPDFPrinterX
1>}在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) };
}
}
}
}