1

我们有一个不时发生的问题。我们有一个 Web 服务器和一个应用程序服务器。我们的应用服务器包含我们的业务逻辑代码,它作为 COM+ 服务器和库应用程序安装。然后,我们在 Web 服务器上放置一个代理,以强制从 Web 服务器到 COM+ 服务器的所有调用。几乎 100% 的时间一切都正常运行。每一次,一个蓝月亮,当然,只有在生产机器上,这个问题才会让人头疼。下面是我们通过企业库记录的事件日志条目。

它开始记录此事件日志:

Type : System.InvalidCastException, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
Message : Unable to cast object of type 'System.__ComObject' to type 'System.EnterpriseServices.IRemoteDispatch'.
Source : System.EnterpriseServices
Help link : 
Data : System.Collections.ListDictionaryInternal
TargetSite : System.Runtime.Remoting.Messaging.IMessage Invoke(System.Runtime.Remoting.Messaging.IMessage)
Stack Trace :    at System.EnterpriseServices.RemoteServicedComponentProxy.Invoke(IMessage reqMsg)
   at System.Runtime.Remoting.Proxies.RealProxy.PrivateInvoke(MessageData& msgData, Int32 type)

然后在稍后的请求之后记录此事件日志。

Type : System.InvalidCastException, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
Message : Unable to cast COM object of type 'System.__ComObject' to interface type 'System.EnterpriseServices.IRemoteDispatch'. This operation failed because the QueryInterface call on the COM component for the interface with IID '{6619A740-8154-43BE-A186-0319578E02DB}' failed due to the following error: The remote procedure call failed. (Exception from HRESULT: 0x800706BE).
Source : System.EnterpriseServices
Help link : 
Data : System.Collections.ListDictionaryInternal
TargetSite : System.Runtime.Remoting.Messaging.IMessage Invoke(System.Runtime.Remoting.Messaging.IMessage)
Stack Trace :    at System.EnterpriseServices.RemoteServicedComponentProxy.Invoke(IMessage reqMsg)
   at System.Runtime.Remoting.Proxies.RealProxy.PrivateInvoke(MessageData& msgData, Int32 type)

堆栈跟踪走得更远一点,但这没关系。基本上在它应该从 Web 服务器跳转到 COM+ 服务器时发生。

我们可以通过在 COM+ Server 上重新启动 COM+ Server 应用程序来解决这个问题,但这对我来说还不够好……我本质上是一个修复者。

这些错误并不完全清楚地说明正在发生的事情。谁能阐明这些错误的含义以及如何避免出现这些错误?

通常情况下,我永远不会发这样的帖子。我想我遇到的问题是正在发生的异常的模糊不清。搜索为什么会发生这种情况会产生很少的结果。

4

2 回答 2

1

它们之间的硬件 Web 服务器、应用程序服务器和防火墙发生了超时。防火墙的超时小于应用程序服务器的默认超时。为了解决这个问题,我们所要做的就是将以下注册表项(一开始并不存在)放在应用程序服务器的注册表中。

创建注册表项:“My Computer\HKey_LOCAL_MACHINE\SYSTEM\ControlSet001\Services\Tcpip\Parameters\KeepAliveTime”。创建一个十六进制值为 300000 的 DWORD 条目。

这增加了应用服务器超时以匹配防火墙的超时。

于 2010-12-22T20:09:22.590 回答
0

据我所知,第二条消息表明远程过程调用失败,这意味着对 QueryInterface 的调用失败。这可能是由于网络中断、COM+ 服务器出现故障(如挂起、超时)或其他问题。如果重复调用有效(不更改任何内容),那么它是某种挂起或超时;如果随后每次重复调用都失败,则 Web 服务器和 COM+ 服务器之间的网络出现故障,或者 COM+ 服务器由于某种原因停止工作。

COM+ 对象中是否存在内存泄漏或其他原因?对象是否被正确释放?是否达到句柄限制?可能值得对 COM 端和 Web 端进行剖析,以了解每个人在对象引用方面的表现都很好。

于 2009-02-03T19:43:04.903 回答