我可以在WCF中使用datacontracts进行流式传输

时间:2010-08-26 10:50:10

标签: wcf performance datacontract

我可以在WCF中使用datacontracts进行流式传输而不是消息合同。

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

感谢

1 个答案:

答案 0 :(得分:6)

答案取决于您使用的绑定。对于TCP或命名管道传输协议,您可以流式传输任何数据 - 包括数据协定。如果你想通过HTTP使用流媒体(由BasicHttpBinding支持),你必须要有几个约束:

  • 绑定时必须允许流式传输
  • 操作必须使用Stream实例或Message契约,它只包含Stream类型的单个body元素。数据协定仅允许作为消息合约上的自定义消息标题。

只有通过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实例+其他数据/数据合同用作消息内容
  • ,则会发生这种情况