Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/reporting-services/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# WCF NetTcp服务和流传输模式_C#_.net_Wcf_Stream_Net.tcp - Fatal编程技术网

C# WCF NetTcp服务和流传输模式

C# WCF NetTcp服务和流传输模式,c#,.net,wcf,stream,net.tcp,C#,.net,Wcf,Stream,Net.tcp,我在将大型xml从客户端发送到WCF net.tcp服务时遇到问题,当调用该方法时,某些计算机上的客户端会抛出内存不足异常,而我无法在本地计算机上重现该异常: 异常消息:未能分配33554432字节的托管内存缓冲区。可用内存量可能较低 因此,在阅读了解决这个问题的方法之后,这是一条正确的道路。 因此,我相应地更改了客户端和服务上的绑定: <netTcpBinding> <binding name="NetTcpBinding_IPricerDataService

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

因此,在阅读了解决这个问题的方法之后,这是一条正确的道路。 因此,我相应地更改了客户端和服务上的绑定:

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

但是,我的印象是,这意味着还需要更改服务方法签名以获取流参数:

我没有这样做,我保留了最初的方法签名,但我的客户机仍然可以按照之前的调用服务方法,并且一切正常

这是否意味着流式转换代码未按预期使用,或者我不需要更改方法签名以支持流式传输?
你知道我怎样才能真正检查吗?

如果你不改变你的方法签名,你就不会严格地流式传输数据,而是像以前一样发送数据,不管服务器配置如何。正如您链接的MSDN文档所述:

  • 保存要传输的数据的参数必须是方法中唯一的参数。例如,如果输入消息是要流式传输的消息,则操作必须只有一个输入参数。类似地,如果要对输出消息进行流式传输,则操作必须只有一个输出参数或一个返回值
  • 参数返回值的至少一种类型必须是、消息或IXmlSerializable
这意味着,对于上游方法,您将指定一个
作为参数,该参数表示向上游发送的数据,对于下游方法,您将指定
作为返回类型,该返回类型将包含要读取的数据

这在以下
服务合同
中进行了说明:

[OperationContract]
Stream GetStream(string data);
[OperationContract]
bool UploadStream(Stream stream);
[OperationContract]
如果您没有如上所示指定方法,那么您将不会在客户端和服务之间流式传输数据-您将使用与更改服务器配置之前完全相同的方法。这也是为什么您的方法仍然有效的原因,即使您指定要在配置中使用流,但没有更改您的方法

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

在旁注中,您的异常消息:

异常消息:未能分配33554432字节的托管内存缓冲区。可用内存量可能较低


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

@DanielKelley它怎么不回答这个问题
这是否意味着流式转换代码未按预期使用,或者我不需要更改方法签名以支持流式传输?
以及一些关于未分配缓冲区的杂乱无章的内容。@DanielKelley谢谢,我将编辑答案,简单地说“是的,你应该这样做。”因为这似乎是你想要的。如果您觉得它不能回答问题,请随意投反对票。@DanielKelley谢谢,我已经详细阐述了我的答案。@aevitas-因此,为了回答我的问题,我已将绑定传输模式更改为流式传输,而不是方法签名,那么为什么方法调用仍然有效,我如何才能真正检查呢?@aevitas我看到你已经编辑了你的答案,这是有意义的:)