答案取决于你使用的约束。对于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
{ ... }
如果不遵循这些约束,最终会出现两种情况:
-
即使为流配置绑定,操作也不会进行流式处理-如果不将流实例用作消息内容,则会发生这种情况。
-
异常-如果使用流实例+其他数据/数据协定作为消息内容,则会发生这种情况