WCF 服务中的 COM 对象

本文关键字:COM 对象 服务 WCF | 更新日期: 2023-09-27 18:35:20

我的 WCF 服务(用 .NET 4.0 编写)存在第二个或任何其他调用卡住的问题。WCF 服务除了调用用 Delphi XE 编写的 COM 对象外,不执行任何其他操作。线程模型设置为"两者",服务的"实例上下文模式"设置为"PerCall"。该对象不比 BSTR DoRequest(BSTR Request)多多少。我使用 Marshal.ReleaseComObject,但在一篇文章中读到这不是清理 com 对象的好方法;我也试过没有。

我尝试了以下方法:

  • 添加了日志记录以查看 WCF 服务卡住的位置。它位于 COM 调用中。
  • 添加了未处理的异常处理程序,但没有异常。
  • 检查德尔菲对象是否使用静态变量
  • 尝试使用 Delphi XE2 进行编译(可能是 Delphi com 库中的错误)
  • 使用多线程德尔菲压力测试工具尝试对象以查看问题是否一样,但它工作得很好。
  • 使用 C# 控制台压力测试工具尝试了该对象,并获得了与在 WCF 服务中。
  • 在创建对象、执行调用和销毁对象。这无济于事。
  • 尝试在 WCF 中创建新线程并将线程模型设置为 STA;将 Delphi 对象线程模型设置为"单个"。这无济于事。
  • 尝试在 COM+ 服务中运行该对象;这没有帮助。
  • 检查了WCF限制,设置为100
  • 检查服务的最大连接数并将其设置为 MaxInt

COM DLL 是 32 位,所以我的 VStudio 项目设置限制为 x86。我在Windows 2008 R2上运行。也许这确实很重要:Delphi COM 对象加载一个C++ DLL,它可能不是踏板安全的。

我使用 Reflector + Dennis Bauer FileDisassembler 来反编译生成的 COM 包装器。我看不出有什么特别之处。

使用Windebug似乎不是很容易,因为Delphi不支持PDB文件。

没有想法,请帮忙:-)

WCF 服务中的 COM 对象

我在德尔菲代码中对第三方 dll 的所有调用中添加了一个关键部分。看起来它现在正在工作。这并不能解释 com 对象的行为,但现在它似乎有效。