C# Ghostscript使服务器崩溃
我的问题是:我正在使用ghostscript将一些PDF转换为jpeg文件,然后将它们渲染到silverlight控件中。我正在使用以下方法转换pdf文件:C# Ghostscript使服务器崩溃,c#,asp.net,iis-7.5,ghostscript,cassini,C#,Asp.net,Iis 7.5,Ghostscript,Cassini,我的问题是:我正在使用ghostscript将一些PDF转换为jpeg文件,然后将它们渲染到silverlight控件中。我正在使用以下方法转换pdf文件: public void PdfToJpg(string ghostScriptPath, string input, string output) { timer1.Enabled = true; //if the pdf has more than 1 file (ex. 3) then 3
public void PdfToJpg(string ghostScriptPath, string input, string output) {
timer1.Enabled = true;
//if the pdf has more than 1 file (ex. 3) then 3 jpeg files will be outputed
String ars = "-dNOPAUSE -sDEVICE=jpeg -r300 -o" + output + "-%d.jpeg " + input;
ProcessStartInfo startInfo = new ProcessStartInfo();
startInfo.WindowStyle = ProcessWindowStyle.Hidden;
startInfo.Arguments = ars;
startInfo.FileName = ghostScriptPath;
startInfo.WindowStyle = ProcessWindowStyle.Hidden;
using (Process exeProcess = Process.Start(startInfo)) {
exeProcess.WaitForExit();
}
}
然后将页码和页面字节[]保存到会话中的字典、字典中,并使用启用silverlight的服务将其发送到包含silverlight控件的aspx页面(带有Response.redirect(page.aspx))。一切正常,但有时服务器(Cassini或IIS)崩溃,这意味着文件被转换,但重定向从未发生,只是页面处于加载状态。我必须用“结束进程”关闭cassini,或重新启动IIS服务器,以便进程再次工作。我不认为问题出在服务上,因为我有一个类似的过程向silverlight应用程序发送一个字节[]的音频文件,并且一切正常,服务器从不卡住,所以我认为这是因为ghostscript…,如果有人有一些想法的话。此外,我正在使用elmah,没有错误报告。。。在调试中,当我单击包含转换和流程其他部分的view按钮时,它不会进入click事件,但转换已完成(不是重定向),我不知道这是如何实现的…,谢谢。所以肯定是有鬼脚本的东西
更新:
我将代码更改为:
using (Process convertProc = new Process()) {
convertProc.StartInfo.FileName = ghostScriptPath;
convertProc.StartInfo.Arguments = args;
//convertProc.StartInfo.UseShellExecute = false;
//convertProc.StartInfo.RedirectStandardOutput = true;
convertProc.StartInfo.CreateNoWindow = true;
convertProc.StartInfo.WindowStyle = ProcessWindowStyle.Hidden;
convertProc.Start();
ThreadedKill(convertProc.Id);
convertProc.PriorityClass = ProcessPriorityClass.Normal;
convertProc.WaitForExit();
}
如果useshellexecute和redirectoutput被注释,服务器有时会变得“疯狂”,如果不是这样,代码每次都运行得非常完美,但是有了它,ghostscript进程的窗口就出现了,我不希望这样。为了不出现,我必须注释这些行,或者将useshellexecute设置为true,并注释redirectoutput,这有时会导致失败。我能做什么?什么是标准输出,它是什么…我不明白在MSDN上
更新2:
将控制台应用程序的gswin64.exe更改为gswin64c.exe,现在我所说的窗口不再显示。没有代码疯了…,至少还没有…首先,你不需要
-dNOPAUSE
,因为-o
意味着-dBATCH
和-dNOPAUSE
,但这并不有害
此问题是否“间歇性”出现?或者,如果您发送的文件多次挂起(使服务器崩溃?):它是每次挂起,还是更频繁地挂起该特定文件
如果这确实是断断续续的,那么就不太可能是鬼脚本
要将Ghostscript中的stdout和stderr捕获到文件中,可以添加-sstdout=\uuuuuuuuuuuuu.out
和-sstderr=\uuuuuuuuuuu.err
以查看Ghostscript是否有投诉。如果您总是写入相同的文件,错误后的内容将告诉您是否有任何消息是由gswin*.exe生成的
添加-Z:
也将向Ghostscript输出添加一些计时信息
请注意,因为您正在使用-r300
进行JPEG输出:如果Ghostscript意外停止,则TEMP目录中会有两个文件以te
开头并具有.tmp
扩展名。这些文件是为用于分带的基于磁盘的“clist”文件创建的(300 dpi字母大小的页面足够大,足以超过默认值8m)
如果您没有在临时文件夹中看到
te_XXXXX.tmp
文件的累积,那么Ghostscript(可能)不会崩溃。首先,您不需要-dNOPAUSE
,因为-o
意味着-dBATCH
和-dNOPAUSE
,但这并不有害
此问题是否“间歇性”出现?或者,如果您发送的文件多次挂起(使服务器崩溃?):它是每次挂起,还是更频繁地挂起该特定文件
如果这确实是断断续续的,那么就不太可能是鬼脚本
要将Ghostscript中的stdout和stderr捕获到文件中,可以添加-sstdout=\uuuuuuuuuuuuu.out
和-sstderr=\uuuuuuuuuuu.err
以查看Ghostscript是否有投诉。如果您总是写入相同的文件,错误后的内容将告诉您是否有任何消息是由gswin*.exe生成的
添加-Z:
也将向Ghostscript输出添加一些计时信息
请注意,因为您正在使用-r300
进行JPEG输出:如果Ghostscript意外停止,则TEMP目录中会有两个文件以te
开头并具有.tmp
扩展名。这些文件是为用于分带的基于磁盘的“clist”文件创建的(300 dpi字母大小的页面足够大,足以超过默认值8m)
如果您在临时文件夹中没有看到
te_XXXXX.tmp
文件的累积,则Ghostscript(可能)不会崩溃。要解决此问题,您可能需要提供有关错误的更具体信息,例如堆栈跟踪异常或至少是Windows错误代码。事件日志中记录了什么?这就是问题所在,没有异常,事件查看器中没有错误,什么都没有..,在TaskManager中,当挂起发生时gswin64.exe没有运行。GPL Ghostscript 9.06(2012-08-08)gswin64.exe要解决此问题,您可能需要提供有关错误的更具体信息,例如,具有堆栈跟踪或至少具有Windows错误代码的异常。事件日志中记录了什么?这就是问题所在,没有异常,事件查看器中没有错误,什么都没有..,在TaskManager中,挂起时gswin64.exe没有运行。GPL Ghostscript 9.06(2012-08-08)gswin64.exeno“te”.临时目录中的tmp文件…,挂起时发送的文件无关紧要,之后我发送的每个文件都不起作用,它正在转换为jpeg文件,但codebehind中的其余代码不会执行。命令应该是怎样的-sstdout=file.out-sstderr=file2.err-sDEVICE=jpeg-r300-o“+output+”-%d.jpeg”+input;,其中.err和.out文件应该在哪里?找不到它们,或者是因为gs不生产