COM + System.InvalidCastException出错。

时间:2009-02-03 19:37:08

标签: c# asp.net com+

我们不时会遇到一个问题。我们有一个Web服务器和一个应用程序服务器。我们的应用服务器包含我们的业务逻辑代码,该代码安装为COM +服务器和库应用程序。然后,我们在Web服务器上放置一个代理,强制从Web服务器到COM + Server的所有调用。几乎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 +服务器上的COM + Server应用程序来解决这个问题,但这对我来说不是一个好的解决方案......我是一个内心的修复者。

这些错误与发生的事情并不完全一致。任何人都可以了解这些错误的含义以及如何避免出现这些错误吗?

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

2 个答案:

答案 0 :(得分:1)

硬件Web服务器&应用服务器&防火墙之间。防火墙的超时小于Application Server的默认超时。我们解决问题所需要做的就是在Application Server的注册表中放置以下注册表项(它不是以开头为准)。

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

这增加了Application Server超时以匹配防火墙的超时。

答案 1 :(得分:0)

根据我能辨别的,第二条消息表明远程过程调用失败,这意味着对QueryInterface的调用失败。这可能是因为网络中断,COM +服务器出现故障,例如挂起,超时或其他问题。如果重复调用有效(没有改变任何东西),那么它就是某种挂起或超时;如果重复呼叫随后每次都失败,则网络服务器和COM +服务器之间的网络关闭,或者COM +服务器因某种原因停止工作。

是否存在内存泄漏或COM +对象中的其他内容?对象是否正确释放?是否达到了手柄限制?可能值得对COM方面和网络方面进行分析,以确保每个人都能很好地使用对象引用。