Delphi - 挂在Fastreport上的ISAPI DLL应用程序

时间:2018-01-29 16:47:02

标签: delphi rtf isapi fastreport iis-10

发现此帖子ISAPI web application hanging if FastReport.PrepareReport is called

它有助于部分解决我的问题。同样我已WisiyngFalse属性设置为frxRichView. base 64 string因为我已经重新StrToStream/LoadFromStream我还尝试从LoadFromFile切换加载到Pdf {1}}。多个访问时问题仍然存在,10个进程中有2个可以完成加载我的rtf文件。所有其他请求都会挂起,直到超时。有谁知道我还能做什么?有没有其他方法可以将Fastreport格式重新编入Selenium报告谢谢。

我只能使用TfrxRichView来测试来自客户端的多次请求时出现超时错误。

更新:我认为报告中只有一个rtf组件会导致挂起,甚至不需要在其上添加memo文本。将其替换为onFailure(Call<ResponseBody> call, Throwable t) { System.out.println(t.getMessage()); //you will get "timeout" as a string in case of actual timeout } 所有请求都将得到解答。

更新:从快速报告中得到答案,我赞同你的意见。 enter image description here

3 个答案:

答案 0 :(得分:0)

确定, 我有类似的问题,找出原因并不容易,但也许你可以在我的考虑之间找到你的解决方案..

1)堆叠尺寸
在IIS中运行时,您的ISAPI只是一个进程调用的DLL,您不是主要进程,因此您必须注意堆栈维度。 通常,Delphi应用程序的默认堆栈大小为1Mb,在ISAPI DLL中,您只有256Kb的堆栈。 也许你正面临一个堆栈溢出异常..它可以解释为什么它总是不会发生但只是在某些情况下......

2)陷阱异常
通常,在编写报告期间会遇到一些错误(也就是处理数据,表达式,变量,公式等等所有工作)会导致陷阱异常。您可能无法从外部看到它,但代码执行被破坏了,报告准备工作尚未完成。

3)MessageBoxes和/或标准例外
在ISAPI中运行时,您不应该向用户界面输出任何内容, 也许消息对话框(或异常)可能会导致意外行为。

4)Global Var
您应该避免使用全局变量,因为在ISAPI中它们将跨线程通用

所以,如果您有源代码,请调试应用程序..首先,您应该了解问题所在。 如果您没有来源..请查看以上列表..我希望您能找到一些有用的信息。

答案 1 :(得分:0)

您有两种方法可以解决这个问题:

1-尝试在调试ISAPI DLL时重新创建此行为。如果幸运的话,您可以识别挂起应用程序的线程。有时这很难甚至不可能重新创建。

2-如果您有权访问挂起的ISAPI应用程序实例,请使用SysInternals Process Explorer之类的工具来创建minidump文件。您的应用程序必须使用完整的调试符号构建,并且您应该具有相应的映射文件。使用从挂起的应用程序和地图文件中获取的一个(或更多 - 甚至更好)转储文件,您可以使用另一个工具WinDbg来分析它并查找原因。 (有时)WinDbg可以准确显示哪个线程挂起整个应用程序以及导致它的代码行。

如果你从未这样做,我必须警告你,这种分析几乎是一场赌博......你必须使用几种不同的工具 或者没有文档,在各个地方阅读大量的技术信息。最后,有时候它会很有效地工作,有时却会失败。

答案 2 :(得分:0)

因为调试ISAPI并不明显,而且因为我希望能够在更多不同的托管解决方案之间轻松切换 - 希望动态更新我的网站 没有重新启动Web服务器/服务 - 我创建了xxm。它具有HTTP上下文的单一接口,您的DLL由IIS ISAPI处理程序,HTTP.SYS处理程序或Apache httpd模块加载,或者在本地调试,您只需将xxmHttp.exe设置为主机应用程序让IIS脱离困境。