【发布时间】:2011-02-13 04:01:36
【问题描述】:
在 WCF 中,我不能将服务 写入 到客户端接收的流中,这对吗?
WCF 支持流式处理请求、响应或两者。 我想支持数据生成器(在流式请求的情况下为客户端,或在流式响应的情况下为服务器)可以在流上写入的场景。这支持吗?
类比是来自 ASP.NET 请求的 Response.OutputStream。在 ASPNET 中,任何页面都可以在输出流上调用 Write,并且内容被客户端接收。我可以在 WCF 服务中执行类似的操作吗 - 在客户端接收到的流上调用 Write?
让我用一个 WCF 插图来解释。 WCF 中流式处理的最简单示例是服务将 FileStream 返回给客户端。这是一个流式响应。实现这个的服务器代码是这样的:
[ServiceContract]
public interface IStreamService
{
[OperationContract]
Stream GetData(string fileName);
}
public class StreamService : IStreamService
{
public Stream GetData(string filename)
{
return new FileStream(filename, FileMode.Open)
}
}
而客户端代码是这样的:
StreamDemo.StreamServiceClient client =
new WcfStreamDemoClient.StreamDemo.StreamServiceClient();
Stream str = client.GetData(@"c:\path\on\server\myfile.dat");
do {
b = str.ReadByte(); //read next byte from stream
...
} while (b != -1);
(示例取自http://blog.joachim.at/?p=33)
清楚,对吧?服务器将 Stream 返回给客户端,客户端在其上调用 Read。
客户端是否可以提供一个 Stream,而服务器可以在其上调用 Write?
换句话说,它不是一个拉模型——客户端从服务器拉数据——它是一个推模型,客户端提供“接收器”流并且服务器写入它。服务器端代码可能类似于:
[ServiceContract]
public interface IStreamWriterService
{
[OperationContract]
void SendData(Stream clientProvidedWritableStream);
}
public class DataService : IStreamWriterService
{
public void GetData(Stream s)
{
do {
byte[] chunk = GetNextChunk();
s.Write(chunk,0, chunk.Length);
} while (chunk.Length > 0);
}
}
这在 WCF 中是否可行,如果可以,如何实现?绑定、接口等需要哪些配置设置?术语是什么?
也许它会起作用? (没试过)
谢谢。
【问题讨论】: