代码之家  ›  专栏  ›  技术社区  ›  Amit

我可以在WCF中使用数据控件进行流式处理吗

  •  3
  • Amit  · 技术社区  · 14 年前

    请允许我使用WCF中的DataContracts进行流式传输,而不是消息协定。

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

    谢谢

    1 回复  |  直到 14 年前
        1
  •  6
  •   Ladislav Mrnka    14 年前

    答案取决于你使用的约束。对于TCP或命名管道传输协议,您可以传输任何数据,包括数据协定。如果要使用HTTP流(由basichttpbinding支持),则必须满足以下几个约束:

    • 绑定时必须允许流式处理
    • 操作必须与仅包含类型为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
    { ... }
    

    如果不遵循这些约束,最终会出现两种情况:

    • 即使为流配置绑定,操作也不会进行流式处理-如果不将流实例用作消息内容,则会发生这种情况。
    • 异常-如果使用流实例+其他数据/数据协定作为消息内容,则会发生这种情况