【问题标题】:Are WCF data streaming restrictions enforced?是否强制执行 WCF 数据流限制?
【发布时间】:2012-06-14 19:49:31
【问题描述】:

我们一直在客户站点看到随机的 OutOfMemoryExceptions 和 InsufficientMemoryExceptions。我们使用 GZipMessageEncoder 来压缩消息。 (我知道IIS 7.x compression 选项和other problems with buffering and/or the GZipMessageEncoder。)

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

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

根据this article on MSDN

流式传输中发生的操作最多可以与一个输入或输出参数签订合同

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

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

<httpTransport ... transferMode="Streamed">

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

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

【问题讨论】:

  • 我不知道答案,但请检查这里是否重复:stackoverflow.com/questions/6094342/…
  • 不同的问题。我了解如何捆绑参数以满足 1 个输入参数的 MSDN 规范。我只是想知道这些限制是否真的被强制执行,如果我确实违反了 WCF 限制,我会看到什么样的错误。
  • 既然绑定参数很容易,为什么还要冒险呢?
  • 因为部署新界面本身就是一个挑战。

标签: c# .net wcf


【解决方案1】:

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

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

【讨论】:

  • 感谢您的回复。我知道数据仍将被缓冲。我不在乎数据实际上没有流式传输。我的问题的主要原因是 GZipMessageEncoder 中缓冲方法的实现。它会导致缓冲区管理器出现零星的 InsufficientMemoryExceptions。我的想法是让 WCF 使用流方法,因此 WCF 将调用使用流作为参数的 GZipMessageEncoder 方法。这可能会避免我们在缓冲实现中看到的错误。 (我们有一个单独的协议来传输大量数据。)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-08-20
  • 2011-06-25
  • 2018-01-20
  • 2013-10-27
  • 2017-06-16
  • 2018-04-04
  • 1970-01-01
相关资源
最近更新 更多