Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/312.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/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
C# 是否强制执行WCF数据流限制?_C#_.net_Wcf - Fatal编程技术网

C# 是否强制执行WCF数据流限制?

C# 是否强制执行WCF数据流限制?,c#,.net,wcf,C#,.net,Wcf,我们在客户站点上看到了随机的OutOfMemoryException和UnficientMemoryException。我们使用GZipMessageEncoder压缩消息。(我知道该选项和。) 我想尝试启用WCF流。我们的WCF服务有如下合同: [OperationContract] DataSet GetDataSet(Guid someGUID, string someName, DataSet parameters); 根据: 跨流传输发生的操作最多可以有一个输入或输出参数

我们在客户站点上看到了随机的OutOfMemoryException和UnficientMemoryException。我们使用GZipMessageEncoder压缩消息。(我知道该选项和。)

我想尝试启用WCF流。我们的WCF服务有如下合同:

[OperationContract]     
DataSet GetDataSet(Guid someGUID, string someName, DataSet parameters);
根据:

跨流传输发生的操作最多可以有一个输入或输出参数

显然,我们的合同违反了WCF流媒体限制。此合同有3个输入参数

然而,出于好奇,我还是决定尝试启用流媒体。我编辑了web.config文件和MyCSharpClient.config文件,并将以下属性插入绑定的传输部分:

<httpTransport ... transferMode="Streamed">

令我惊讶的是,一切似乎都正常!没有抛出异常。我可以进入GZipMessageEncoder并验证调用的是流方法而不是缓冲区方法


所以,我的问题是:为什么我能够在违反WCF输入参数限制的操作上下文上设置流传输?鉴于MSDN streaming文章的措辞强硬,我假设这只是一个实现细节,我不能依赖于此行为。

目前发生的情况如下:您在HTTP传输上启用了流,因此传输没有缓冲任何内容-传输接收一个
消息
对象,并将其直接写入传输流(包装在XML编写器中)。但是,操作的参数在序列化之前会被缓冲,因此您要“支付”内存使用量,而传输模式设置为“缓冲”。在网络上,不同之处在于,来自此服务的响应将被分块(即,它将有一个
传输编码:分块
头,并且主体将被相应地格式化。但它也可以工作


我认为MSDN中的文章可以选择更好的词。为了让操作利用流媒体,它需要一个单独的参数,通常是
消息
或实现
IXmlSerializable
的某种类型。但需要一个简单的契约(即
[OperationContract]int Add(int x,int y)
)也可以工作。我想它会继续这样工作,因为一个合同有“正常”操作和利用流的操作是完全有效的,而且传输模式需要为每个端点(而不是每个操作)设置,它必须为“简单”工作操作也一样。

我不知道答案,但请检查此处是否重复:不同的问题。我了解如何捆绑参数以满足1个输入参数的MSDN规范。我只想知道这些限制是否实际执行,以及如果违反WCF限制,我会看到什么样的错误。当捆绑参数很容易时,为什么还要冒险呢?因为部署一个新接口本身就是一个挑战。感谢您的回答。我知道数据仍将被缓冲。我不在乎数据是否实际流化。我的问题的主要原因是GZipMessageEncoder中缓冲方法的实现。它会导致缓冲区管理器出现零星的内存不足异常。我的想法是让WCF使用流式方法,因此WCF将调用使用流作为参数的GZipMessageEncoder方法。这可能会避免我们在缓冲实现中看到的错误。(我们有一个单独的协议用于流式处理大量数据。)