【问题标题】:Can i use datacontracts in WCF for streaming我可以在 WCF 中使用数据合同进行流式传输吗
【发布时间】:2010-08-26 10:50:09
【问题描述】:

请问我可以在 WCF 中使用数据合同而不是消息合同来进行流式传输吗?

如果是,它会提供任何性能改进吗?

谢谢

【问题讨论】:

  • 你能发布例子吗?您将使用哪种绑定?
  • 我不确定,因为我对 WCF 很陌生。能否请您提供一些链接,以帮助我开始使用 WCF 进行流式传输。

标签: wcf performance datacontract


【解决方案1】:

答案取决于您使用的绑定。对于 TCP 或命名管道传输协议,您可以流式传输任何数据 - 包括数据合同。如果你想通过 HTTP 使用流式传输(BasicHttpBinding 支持),你必须有一些限制:

  • 绑定时必须允许流式传输
  • 操作必须与仅包含 Stream 类型的单个主体元素的 Stream 实例或消息合约一起使用。数据合约仅允许作为消息合约上的自定义消息头。

只有通过 HTTP 进行流式传输的有效操作定义是:

// StreamedResponse
[OperationContract]
Stream GetData(int id);

// StreamedRequest
[OperationContract]
int PostData(Stream data);

// Streamed
[OperationContract]
Stream WorkWithData(Stream data);

[OperationContract]
DoSomethingResponse DoSomething(DoSomethingReqest request);

[MessageContract]
public class DoSomethingRequest
{
  // Custom data and data contract allowed only as SOAP headers which are always buffered
  [MessageHeader]
  public MyDataContract CustomHeader { get; set; }

  // No other member allowed
  [MessageBodyMember]
  public Stream Data { get; set; }
}

[MessageContract]
public class DoSomethingResponse
{ ... }

如果你不遵守这些限制,你最终会遇到两种情况:

  • 即使您为流式传输配置绑定,操作也不会流式传输 - 如果您不使用 Stream 实例作为消息内容,就会发生这种情况
  • 例外 - 如果您使用 Stream 实例 + 其他数据/数据合同作为消息内容,则会发生这种情况

【讨论】:

  • 这里的流式传输是什么意思。只是发回说员工数据被视为流式传输?
猜你喜欢
  • 1970-01-01
  • 2013-05-25
  • 2017-02-07
  • 1970-01-01
  • 2012-11-11
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多