C# 是否强制执行WCF数据流限制?
我们在客户站点上看到了随机的OutOfMemoryException和UnficientMemoryException。我们使用GZipMessageEncoder压缩消息。(我知道该选项和。) 我想尝试启用WCF流。我们的WCF服务有如下合同:C# 是否强制执行WCF数据流限制?,c#,.net,wcf,C#,.net,Wcf,我们在客户站点上看到了随机的OutOfMemoryException和UnficientMemoryException。我们使用GZipMessageEncoder压缩消息。(我知道该选项和。) 我想尝试启用WCF流。我们的WCF服务有如下合同: [OperationContract] DataSet GetDataSet(Guid someGUID, string someName, DataSet parameters); 根据: 跨流传输发生的操作最多可以有一个输入或输出参数
[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方法。这可能会避免我们在缓冲实现中看到的错误。(我们有一个单独的协议用于流式处理大量数据。)