C# Ghostscript使服务器崩溃

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

我的问题是:我正在使用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 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不生产