gpt4 book ai didi

c# - WCF NetTcp 服务和流传输模式

转载 作者:太空宇宙 更新时间:2023-11-03 10:42:58 24 4
gpt4 key购买 nike

我在从客户端向 WCF net.tcp 服务发送大型 xml 时遇到问题,当调用该方法时,某些机器上的客户端会抛出内存不足异常,我无法在本地机器上重现该异常:异常消息:无法分配 33554432 字节的托管内存缓冲区。可用内存量可能不足。

因此,在阅读解决此问题的方法后,接缝流是可行的方法。所以我相应地更改了客户端和服务的绑定(bind):

<netTcpBinding>
<binding name="NetTcpBinding_IPricerDataService" closeTimeout="00:10:00" transferMode="Streamed"
openTimeout="00:10:00" sendTimeout="00:10:00" maxBufferPoolSize="2147483647"
maxReceivedMessageSize="2147483647" />
</netTcpBinding>

但是,我的印象是这还意味着更改服务方法签名以采用流参数: http://msdn.microsoft.com/en-us/library/ms789010(v=vs.110).aspx

我没有这样做,我保留了最初的方法签名,但我的客户仍然可以按照以前的方式调用服务方法,并且一切都按预期工作。

这是否意味着流传输转换节点没有按预期使用,或者我不需要更改方法签名来支持流传输?有什么想法可以真正检查吗?

最佳答案

如果您不更改您的方法签名,那么您就不是严格地流式传输数据,而是完全按照以前的方式发送数据,而不管服务器配置如何。正如您链接的 MSDN 文档所述:

  • 保存要流式传输的数据的参数必须是方法中的唯一参数。例如,如果输入消息是要流式传输的消息,则该操作必须只有一个输入参数。同样,如果要流式传输输出消息,则该操作必须恰好有一个输出参数或一个返回值
  • 参数返回值的类型中至少有一种必须是Stream、Message或IXmlSerializable。

这意味着,对于您的upstream 方法,您将指定一个Stream 作为参数,它表示您向上流发送的数据,对于您的downstream 方法,您将 Stream 指定为返回类型,它将包含要读取的数据。

这在以下 ServiceContract 中进行了演示:

[OperationContract]
Stream GetStream(string data);
[OperationContract]
bool UploadStream(Stream stream);
[OperationContract]

如果您没有像上面演示的那样指定您的方法,您将不会最终在客户端和服务之间流式传输数据 - 您将使用与更改服务器配置之前完全相同的方法。这也是为什么您的方法仍然有效的原因,即使您指定要在配置中使用流式传输,但没有更改您的方法。

更改这些方法以符合 MSDN 文章中列出的标准,您应该正确地传输数据。只需确保将整个上行/下行流的事情都考虑在内,因为它对于客户端和服务器而言是相反的。

附带说明,您的异常消息:

Exception Message: Failed to allocate a managed memory buffer of 33554432 bytes. The amount of available memory may be low.

表示系统无法为包含您的数据的底层缓冲区分配 32MB 的数据。即使您正确实现流式传输,此问题也可能继续存在。在正常情况下,32MB 缓冲区应该不是问题。

关于c# - WCF NetTcp 服务和流传输模式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24632806/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com