【发布时间】:2012-06-01 16:35:19
【问题描述】:
我的 WCF 服务(用 .NET 4.0 编写)存在第二个或任何其他调用卡住的问题。 WCF 服务除了调用一个用 Delphi XE 编写的 COM 对象之外什么也不做。线程模型设置为 Both,服务的 InstanceContextMode 设置为 PerCall。该对象并没有比 BSTR DoRequest(BSTR Request) 多多少。 我使用 Marshal.ReleaseComObject,但在一篇文章中读到这不是清理 com 对象的好方法;我也试过了。
我尝试了以下方法:
- 添加了日志记录以查看 WCF 服务卡住的位置。它在 COM 调用中。
- 添加了未处理的异常处理程序,但没有异常。
- 检查 Delphi 对象是否使用静态变量
- 尝试使用 Delphi XE2 进行编译(可能是 delphi com 库中的错误)
- 用多线程的Delphi压力测试工具试了Object,看看是不是问题 一样,但效果很好。
- 使用 C# 控制台压力测试工具尝试了该对象,并获得了与 在 WCF 服务中。
- 在创建对象、执行调用和销毁对象的过程中添加了一个锁定对象 目的。这没有帮助。
- 尝试在 WCF 中创建一个新线程并将线程模型设置为 STA; 将 Delphi 对象线程模型设置为 Single。这没有帮助。
- 试图在 COM+ 服务中运行对象;这没有帮助。
- 检查了 WCF 限制,设置为 100
- 检查了服务的最大连接数并设置为 MaxInt
COM DLL 是 32 位的,所以我的 VStudio 项目设置限制为 x86。我在 Windows 2008 R2 上运行。也许这很重要:Delphi COM 对象加载了一个 C++ DLL,这可能不是安全的。
我使用 Reflector + Dennis Bauer FileDisassembler 来反编译生成的 COM Wrapper。我看不出有什么特别之处。
使用 Windebug 似乎并不容易,因为 Delphi 不支持 PDB 文件。
想法用完了,请帮忙:-)
【问题讨论】:
-
您是否尝试从您的服务中调用一个虚拟 COM 类来正确定位问题?如果您编写的 WCF 与虚拟 COM 一起使用,那么您的 Delphi COM 类就是罪魁祸首。尝试模仿设置(32 位,调用另一个 C++ DLL 等)
-
我要用 c++ 重写 delphi com 的最小部分,但我希望有人大声喊出你有没有想过这个属性或一些简单的事情:-)
-
你必须调试那个delphi代码。如果您记录您在冻结时用来调用的参数,您可以加载该 DLL 并使用相同的参数从测试 delphi 应用程序中调用它,这将帮助您使用 COM 进行调试,并且超出了图片范围。但是您将需要 Delphi、DLL 的源代码以及使其崩溃的参数值,然后您将不得不自己调试该代码。
-
@Warren,已经这样做了。猜猜它的工作原理,即使它是多头的,请参见上面的 cmets。
-
我认为这与 WCF 设置或编组处理有关。它甚至不会抛出任何异常,它只是像 WCF 的所有工作线程都被一个悬空对象阻塞一样卡住了。
标签: c# wcf delphi com com-interop