0

我有一个使用 Microsoft RPC 进行进程间通信的程序。当调用带有 [in, string] 参数的方法时(MIDL 表示法):

interface IOurInterface
{
    error_status_t rpcMethod( [in, string] const WCHAR* parameter );
}

调用它通常是成功的。但是如果参数字符串足够长(超过大约 300 万个字符),调用会失败并显示 RPC_S_CALL_FAILED_DNE(“远程过程调用失败并且没有执行。”)。这肯定取决于字符串的长度。如果字符串在限制范围内,相同条件下的相同调用始终成功,如果字符串较长,则始终失败。看起来限制也取决于系统或机器。

有没有人观察到这种行为以及可能的解决方案是什么(不缩短参数)?

4

2 回答 2

1

我之前观察过该消息,但我不认为这是相同的原因 - “未执行”是一个通用的 RPC 错误,可能由许多事情引起。

在我们的特殊情况下,这是因为我们过于用力地敲击 WMI 而没有清理我们的对象。但在你的情况下,这似乎是一个不同的原因。

我知道您说您不想缩短参数,但这可能是您前进的唯一途径。我很难想象您需要通过 RPC 调用发送 6M 的情况。也许如果您解释其背后的原因,我们可以提供进一步的帮助。

基于迄今为止的评论的其他可能性:

1/ 分割。

让 RPC 调用限制通过网络传输的数据量。这可以通过在源处对消息进行分段并在目标处对其进行重构来完成,例如具有三个参数(您可以让服务器在另一个 RPC 调用中分发消息标识符或找到其他方法来确保没有两个客户端具有相同的ID): - 消息标识符(用于将消息段捆绑在一起)。- 最后一个标志(开始重建过程)。- 有限大小的段(例如,1M)。

2/ 压缩。

由于 XML 是文本,因此压缩的时机已经成熟。7zip 库是我见过的在减小尺寸方面最好的库。这是否足够快是另一回事。

3/可能通过更改注册表来修复。

查看 RpcMaxSize 键的 HKLM/Software/Microsoft/Rpc 注册表区域。我用谷歌搜索了几个网站,建议将其设置为 -1 将消除大小限制(全球范围内,所以要小心)。

4/注册界面时可能的修复。

您显然可以在特定接口上实现与 (3) 相同的效果RpcServerRegisterIf2()

于 2009-04-09T12:52:07.597 回答
1

作为一个整体,每个 RPC 调用的大小通常受到各种因素的限制,例如传输限制(例如:UDP 上的数据包大小、比特率/最大延迟)

您可以做的是将字符串拆分为数据包并通过多次调用发送,

或打开一个额外的 tcp 套接字来发送您的数据并使用您当前的 RPC 控制它

于 2009-04-09T12:52:31.650 回答