【问题标题】:COM Object in WCF ServiceWCF 服务中的 COM 对象
【发布时间】: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


【解决方案1】:

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

【讨论】:

  • 如果有更好的答案,我会接受。我仍在分析问题并希望找到更好的解决方案;如果我有,我会在这里发布。
  • 嗨,你能解释一下你是如何解决这个问题的吗?我可能有一个类似的,我调用第三方 dll 在服务调用中创建一个 COM 对象(但这个 dll 本身是 .NET 兼容的),它永远挂在这个调用上。但是,如果我在服务调用以外的其他地方创建此对象,则确实会创建此对象。感谢您的帮助!
  • 我发现了一些问题。我必须在整个调用中使用静态临界区,但我必须调用 Marshal.ReleaseComObject。这个解决方案很烂,我还在调查:-)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-02-21
  • 1970-01-01
  • 1970-01-01
  • 2010-12-17
相关资源
最近更新 更多