Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/asp.net-mvc-3/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Asp.net mvc 3 Azure和Rotativa用于ASP.NET MVC3的PDF打印_Asp.net Mvc 3_Azure_Pdf Generation - Fatal编程技术网

Asp.net mvc 3 Azure和Rotativa用于ASP.NET MVC3的PDF打印

Asp.net mvc 3 Azure和Rotativa用于ASP.NET MVC3的PDF打印,asp.net-mvc-3,azure,pdf-generation,Asp.net Mvc 3,Azure,Pdf Generation,我正在使用for ASP.NET MVC应用程序从html内容生成pdf。在标准IIS上单独运行MVC应用程序时,这非常有效;pdf几乎立即生成 但是,当MVC应用程序在Azure中作为web角色部署时(在开发环境和cloudapp.net上都是本地的),生成pdf打印文件需要45秒,而且显示内容资源时似乎也有问题(链接被破坏)。有些事情似乎不对劲,不应该花那么长时间 pdf生成本身是使用wkhtmltopdf工具完成的,该工具将html内容转换为pdf。wkhtmltopdf是一个可执行文件,

我正在使用for ASP.NET MVC应用程序从html内容生成pdf。在标准IIS上单独运行MVC应用程序时,这非常有效;pdf几乎立即生成

但是,当MVC应用程序在Azure中作为web角色部署时(在开发环境和cloudapp.net上都是本地的),生成pdf打印文件需要45秒,而且显示内容资源时似乎也有问题(链接被破坏)。有些事情似乎不对劲,不应该花那么长时间

pdf生成本身是使用wkhtmltopdf工具完成的,该工具将html内容转换为pdf。wkhtmltopdf是一个可执行文件,使用Process.Start执行,MVC应用程序再次调用它

    /// <summary>
    /// Converts given URL or HTML string to PDF.
    /// </summary>
    /// <param name="wkhtmltopdfPath">Path to wkthmltopdf.</param>
    /// <param name="switches">Switches that will be passed to wkhtmltopdf binary.</param>
    /// <param name="html">String containing HTML code that should be converted to PDF.</param>
    /// <returns>PDF as byte array.</returns>
    private static byte[] Convert(string wkhtmltopdfPath, string switches, string html)
    {
        // switches:
        //     "-q"  - silent output, only errors - no progress messages
        //     " -"  - switch output to stdout
        //     "- -" - switch input to stdin and output to stdout
        switches = "-q " + switches + " -";

        // generate PDF from given HTML string, not from URL
        if (!string.IsNullOrEmpty(html))
            switches += " -";

        var proc = new Process
                       {
                           StartInfo = new ProcessStartInfo
                                           {
                                               FileName = Path.Combine(wkhtmltopdfPath, "wkhtmltopdf.exe"),
                                               Arguments = switches,
                                               UseShellExecute = false,
                                               RedirectStandardOutput = true,
                                               RedirectStandardError = true,
                                               RedirectStandardInput = true,
                                               WorkingDirectory = wkhtmltopdfPath,
                                               CreateNoWindow = true
                                           }
                       };
        proc.Start();

        // generate PDF from given HTML string, not from URL
        if (!string.IsNullOrEmpty(html))
        {
            using (var sIn = proc.StandardInput)
            {
                sIn.WriteLine(html);
            }
        }

        var ms = new MemoryStream();
        using (var sOut = proc.StandardOutput.BaseStream)
        {
            byte[] buffer = new byte[4096];
            int read;

            while ((read = sOut.Read(buffer, 0, buffer.Length)) > 0)
            {
                ms.Write(buffer, 0, read);
            }
        }

        string error = proc.StandardError.ReadToEnd();

        if (ms.Length == 0)
        {
            throw new Exception(error);
        }

        proc.WaitForExit();

        return ms.ToArray();
    }
//
///将给定的URL或HTML字符串转换为PDF。
/// 
///指向PDF的路径。
///将传递给wkhtmltopdf二进制文件的开关。
///包含应转换为PDF的HTML代码的字符串。
///PDF作为字节数组。
私有静态字节[]转换(字符串wkhtmltopdfPath、字符串开关、字符串html)
{
//开关:
//“-q”-静默输出,仅错误-无进度消息
//“-”-将输出切换到标准输出
//“-”-将输入切换到标准输入,并将输出切换到标准输出
开关=“-q”+开关+”-”;
//从给定的HTML字符串而不是URL生成PDF
如果(!string.IsNullOrEmpty(html))
开关+=“-”;
var proc=新流程
{
StartInfo=新流程StartInfo
{
FileName=Path.Combine(wkhtmltopdfPath,“wkhtmltopdf.exe”),
参数=开关,
UseShellExecute=false,
重定向标准输出=真,
RedirectStandardError=true,
重定向标准输入=真,
WorkingDirectory=wkhtmltopdfPath,
CreateNoWindow=true
}
};
proc.Start();
//从给定的HTML字符串而不是URL生成PDF
如果(!string.IsNullOrEmpty(html))
{
使用(变量sIn=proc.StandardInput)
{
sIn.WriteLine(html);
}
}
var ms=新内存流();
使用(var sOut=proc.StandardOutput.BaseStream)
{
字节[]缓冲区=新字节[4096];
int-read;
而((read=sOut.read(buffer,0,buffer.Length))>0)
{
ms.Write(缓冲区,0,读取);
}
}
字符串错误=proc.StandardError.ReadToEnd();
如果(ms.Length==0)
{
抛出新异常(错误);
}
进程WaitForExit();
返回ToArray女士();
}
有没有人知道是什么导致了问题和性能下降

比尔


我找到了根本原因。生成的pdf中损坏的URL导致性能下降。由于负载平衡,Azure在URL中包含端口号,因此我需要将URL转换为不带端口号的“公共”URL。

您可以对Azure VM启用RDP并运行PerfMon以查看总共花费了45秒的位置,然后决定下一步要做什么。这是非常容易猜测性能问题,但我相信它不会帮助你。谢谢你的输入。我已经记录了从proc.Start到proc.WaitForExit()之后的时间。在两次操作之间,平均执行时间为43秒。我的猜测是,读取内存流会影响性能。如果在本地计算机上执行同样的操作,需要多长时间?你能进一步解释哪些API占用了大部分时间吗?如果有任何特定于Azure的API,我肯定可以根据需要帮助您进行优化,但是我认为现在没有必要进一步挖掘..我找到了根本原因。生成的pdf中损坏的URL导致性能下降。由于负载平衡,Azure在URL中包含端口号,因此我需要将URL转换为不带端口号的“公共”URL。@Paras问道,“您能否共享代码以将视图转换为PDF。我遇到了同样的问题。这将是一个很大的帮助。”