是否强制实施 WCF 数据流限制

本文关键字:数据流 WCF 是否 | 更新日期: 2023-09-27 18:36:46

我们在客户站点看到了随机的 OutOfMemoryExceptions 和 InenoughMemoryExceptions。 我们使用GZipMessageEncoder来压缩消息。 (我知道IIS 7.x压缩选项以及缓冲和/或GZipMessageEncoder的其他问题。

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

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

根据MSDN上的这篇文章:

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

显然,我们的合约违反了 WCF 流式处理限制。 此合约有 3 个输入参数。

但是,出于好奇,我决定无论如何都要尝试启用流媒体。 我编辑了 web.config 文件和 MyCSharpClient.config 文件,并将以下属性插入到绑定的传输部分:

<httpTransport ... transferMode="Streamed">

令我惊讶的是,无论如何,一切似乎都有效! 没有引发任何异常。 我可以闯入 GZipMessageEncoder 并验证是否正在调用流方法而不是缓冲区方法。

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

是否强制实施 WCF 数据流限制

当前的情况如下:您在 HTTP 传输上启用了流式处理,因此传输不会缓冲任何内容 - 传输接收一个Message对象,并将其直接写出到传输流(包装在 XML 编写器中)。但是,操作的参数在序列化之前会缓冲,因此您需要"支付"内存使用量,而将传输模式设置为"缓冲"。在网络上,不同之处在于来自此服务的响应,而不是具有 Content-Length 标头,将被分块(即,它将具有 Transfer-Encoded: chunked 标头,并且正文将相应地格式化。但它也会同样有效。

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