“调用失败且未执行”
Posted
技术标签:
【中文标题】“调用失败且未执行”【英文标题】:"call failed and did not execute" 【发布时间】:2009-04-09 11:53:56 【问题描述】:我有一个使用 Microsoft RPC 进行进程间通信的程序。当调用带有 [in, string] 参数的方法时(MIDL 表示法):
interface IOurInterface
error_status_t rpcMethod( [in, string] const WCHAR* parameter );
被调用它通常是成功的。但是如果参数字符串足够长(超过大约 300 万个字符),调用会失败并显示 RPC_S_CALL_FAILED_DNE(“远程过程调用失败并且没有执行。”)。这肯定取决于字符串的长度。如果字符串在限制范围内,相同条件下的相同调用始终成功,如果字符串较长,则始终失败。看起来限制也取决于系统或机器。
有没有人观察到这种行为以及可能的解决方案是什么(不缩短参数)?
【问题讨论】:
【参考方案1】:作为一个整体,每个 RPC 调用的大小通常受到各种因素的限制,例如传输限制(例如:UDP 上的数据包大小、比特率/最大延迟)
您可以做的是将字符串拆分为数据包并通过多次调用发送,
或者打开一个额外的 tcp 套接字来发送你的数据并用你当前的 RPC 控制它
【讨论】:
RPC 有一种发送大量数据的好方法,称为“管道”。问题是我们试图切换到它并看到它的行为很奇怪 - ***.com/questions/684625/…【参考方案2】:我之前观察过该消息,但我认为原因不同 - “未执行”是一个通用的 RPC 错误,可能由多种原因引起。
在我们的特殊情况下,这是因为我们过于用力地敲击 WMI 而没有清理我们的对象。但在你的情况下,这似乎是一个不同的原因。
我知道您说过您不想缩短参数,但这可能是您前进的唯一方法。我很难想象您需要通过 RPC 调用发送 6M 的情况。也许如果你解释一下背后的原因,我们可以提供进一步的帮助。
迄今为止基于 cmets 的其他可能性:
1/ 分割。
让 RPC 调用限制通过网络传输的数据量。这可以通过在源处对消息进行分段并在目标处对其进行重构来完成,例如具有三个参数(您可以让服务器在另一个 RPC 调用中分发消息标识符或找到其他方法来确保没有两个客户端具有相同的ID): - 消息标识符(用于将消息段捆绑在一起)。 - 最后一个标志(开始重建过程)。 - 有限大小的段(例如 1M)。
2/ 压缩。
由于 XML 是文本,因此压缩的时机已经成熟。 7zip 库是我见过的在减小尺寸方面最好的库。这是否足够快是另一回事。
3/ 可能通过更改注册表来修复。
查看 RpcMaxSize 键的 HKLM/Software/Microsoft/Rpc 注册表区域。我用谷歌搜索了几个网站,建议将其设置为 -1 将消除大小限制(全球范围内,所以要小心)。
4/ 可能在注册您的界面时修复。
你显然可以在RpcServerRegisterIf2()
的特定界面上实现与(3)相同的效果。
【讨论】:
原因是我们发送了一个大型对象的 XML 表示并且不想考虑优化它(但这绝对是可能的)。因此,如果有一种简单的方法可以绕过该问题,那将非常方便。 好吧,分段是一种可能性:将您的参数限制为会话 ID、最后一个标志和(例如)1M 的文本。您必须在源处对 XML 进行分段,并在目标处将其重新组合在一起。不是我的第一选择,而是一个快速而肮脏的解决方案,应该以最少的努力工作。 是的,这很有效,而且很简单,但零努力的解决方案(如果有的话)会更方便。懒惰,你知道...以上是关于“调用失败且未执行”的主要内容,如果未能解决你的问题,请参考以下文章