4

使用NuGet 的Rotativa 1.6.4并注意到使用以下代码的以下问题。

ActionAsPdf 随机挂起的时间不确定。

下面的代码挂起:

   var pdfResult = new ActionAsPdf("Report", new {id = Request.Params["id"]})
    {
        Cookies = cookieCollection,
        FormsAuthenticationCookieName = FormsAuthentication.FormsCookieName,
        CustomSwitches = "--load-error-handling ignore"
    };

可能有帮助的背景信息:

customSwitches 用于忽略使用 ActionAsPdf 调用 wkhtmltopdf.exe 的记录问题,但它不会仅在 wkhtmltopdf 调用中抑制代码中的错误。

观察、使用和测试:

它可以工作,但是在运行应用程序时(无论是否单步执行代码),在点击 pdfResult = new ActionAsPdf 和最终进入被调用的“报告”操作之间可能需要 10 秒到大约 4 分钟。无法辨别 Visual Studio 的输出窗口中实际发生的任何事情,我发现没有抛出任何错误。只是随机缓慢过渡到 Reports() 操作。

我可以直接通过 URL 运行 Reports() 操作,它永远不会像这样变慢,并且对于 PDF 生成来说非常快。我正在使用 ActionAsPdf 运行它以获取二进制文件以保存到文件系统并通过电子邮件发送,这是该库的规定方法。

该行为同时存在于本地 Windows 10 开发盒和远程 Server 2008R2 测试盒上。两个盒子上的 .Net 4.5.1,每个盒子上的默认 IIS。

我的问题:

关于可能导致速度变慢的原因以及如何补救的任何想法?

4

2 回答 2

1

我最终使用 UrlAsPdf() 而不是 ActionAsPdf() 并且它有效。似乎 ActionAsPdf() 可能存在一些问题,我已经在 GitHub 上向 Rotative 项目提交了一个错误。ActionAsPdf() 仍被标记为测试版,因此希望它在未来的版本或社区中得到修复。

于 2015-10-12T21:26:02.230 回答
0

在我的例子中,我不得不在使用 UrlAsPdf() 的同时做更多的调整。我已将问题范围缩小到我添加的 cookie 集合。所以我尝试只添加我需要的cookie,问题就解决了。以下是我使用的示例代码。

        var report = new UrlAsPdf(url);

        Dictionary<string, string> cookieCollection = new Dictionary<string, string>();
        foreach (var key in Request.Cookies.AllKeys)
        {
           if (Crypto.Hash("_user").Equals(key))
           {
              cookieCollection.Add(key, Request.Cookies.Get(key).Value);
              break;
           }
        }
        report.Cookies = cookieCollection;
        report.FormsAuthenticationCookieName = FormsAuthentication.FormsCookieName;
于 2020-11-08T18:34:17.363 回答