【问题标题】:Using wkhtmltopdf inside asp.net mvc takes a long time to start在 asp.net mvc 中使用 wkhtmltopdf 需要很长时间才能启动
【发布时间】:2012-03-31 13:58:39
【问题描述】:

我正在使用 wkhtmltopdf 下载页面并创建 pdf,如 here 中所述。这一切都按预期工作,但是当它到达以下行时:

int read = proc.StandardOutput.BaseStream.Read(buffer, 0, buffer.Length);

需要很长时间才能继续。 我还尝试了以下方法:

proc.Start();
string output = proc.StandardOutput.ReadToEnd();
string error = proc.StandardError.ReadToEnd();
proc.WaitForExit();

但同样的事情发生在第 2 行 (proc.StandardOutput.ReadToEnd())。

我该如何调试?

注意:当我调试整个项目时,我看到 wkhtmltopdf 进程正在调用的页面仅在延迟后才被调用。所以延迟发生在操作系统调用和页面下载本身之间。


编辑

所以我将参数部分更改为简单的http://google.com -,它执行得非常快。

所以问题出在我的全部论点中:--stop-slow-scripts --redirect-delay 1500 --cookie MOODLEID_ %25E2%25C8%2513E%25BD --cookie ASP.NET_SessionId mg3mfaisk45zn5y1aql0glbb --cookie .ASPXAUTH FEA3D10032E211EDB330E967D8F19A324A912AD792219CA281451AA809F1B580B25466DAF81DE30DF07252FF13F0888C88ED4DB5871579F1DA3EBAA447CBF860131F6FF00A763C9207CE13BCB143301E49A2B00EEBBF1F4AE14F109DF1BE8D3B39C43478B99E4C686C3849D1D51DDBFA3D2E871691BAB8346FE5195D867F88F662F72E40 http://localhost:8404/Relatorio/GeralEstaticoPDF?id=15&pesq_cod=0&IncluirParciais=True&NomesImagens[0]=3fd5b6a2-76a4-470b-af99-93500cc90431.png&NomesImagens[1]=c1c86234-c338-4285-9d25-5069be36a213.png&NomesImagens[2]=4562f9a3-72aa-452c-9736-6d0ba65f59ce.png&NomesImagens[3]=dbc54344-6248-4ee3-9e43-9cb3ef89cc67.png&NomesImagens[4]=8c954917-d572-4d4a-b6fd-2b9cd09e8f8e.png -

我需要 cookie 来保存会话。

如果我直接在命令行上运行它(但输入一个文件名而不是-)它也运行得很快。


编辑 2

所以问题肯定是 cookie,如果我删除它们,它会快速执行,但它只会给我 pdf 上的登录屏幕,因为它没有保留会话。

【问题讨论】:

    标签: asp.net asp.net-mvc process wkhtmltopdf


    【解决方案1】:

    这似乎是导致问题的会话 cookie、表单身份验证 cookie 或任何其他 cookie 都可以。原因是这样的:

    “为避免会话存储中的数据冲突和意外的会话状态行为,SessionStateModule 和 SessionStateStoreProviderBase 类包含锁定功能,可在 ASP.NET 页面执行期间专门锁定特定会话的会话存储项。”

    http://msdn.microsoft.com/en-us/library/system.web.sessionstate.sessionstatestoreproviderbase%28VS.80%29.aspx

    【讨论】:

      【解决方案2】:

      PhilJ 的回答是正确的,但我想为未来的访问者添加一个可能的解决方案。

      简而言之:

      [SessionState(System.Web.SessionState.SessionStateBehavior.ReadOnly)] 属性添加到控制器(进行打印)为我解决了这个问题。

      我实际上使用的是 Rotativa 库,而后者又使用 wkhtmltopdf。

      (在提问中添加 Rotativa 标签可能会有所帮助?)

      【讨论】:

      • 您好,希望您阅读本文。我使用没有 MVC 和 wkhtmltopdf 的 asp.net。我有同样的会话问题,所以我将EnableSessionState="ReadOnly" 添加到打印页面,但仍然是登录屏幕。如果我将会话 cookie id 添加为 wkhtmltopdf 的参数,我的应用程序就像 PhilJ 所说的那样挂起。你知道我还能做些什么吗?
      • 好的,它没有挂起,大概需要两分钟 :(
      • 完美答案!
      【解决方案3】:

      我将添加我在两个不同项目中遇到的经验。

      我生成 pdf 的选项是:

      string[] options = new string[] { 
                  "--cookie", "ASP.NET_SessionId", System.Web.HttpContext.Current.Session.SessionID,
                  "--cookie", ".ASPNETAUTH", HttpContext.Current.Request.Cookies[".ASPNETAUTH"].Value};
      

      然后我在调用者的页眉中添加:EnableSessionState="ReadOnly",它就可以工作了。

      【讨论】:

        猜你喜欢
        • 2013-11-15
        • 2014-02-23
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-02-28
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多