C# 在一个WCF操作/调用中发送和返回连续的大流
我想向WCF服务发送一个数据流(大文件>2GB),对其进行处理,然后将处理后的数据作为流返回(C# 在一个WCF操作/调用中发送和返回连续的大流,c#,wcf,stream,C#,Wcf,Stream,我想向WCF服务发送一个数据流(大文件>2GB),对其进行处理,然后将处理后的数据作为流返回(transferMode=“Streamed”),而不需要在内存中缓冲整个流,然后将其发送回 我知道(在WCF操作之外)流式传输数据的传统方法包括 在使用端,使用输入流和输出流作为参数向(WCF服务)void方法发送流 在消费端,还具有接收流以获取 传入的、已处理的输出流 在该方法中,处理该输入流,然后写入 将已处理的字节发送到输出流 这些处理的字节是通过输出流接收的 这样,水流就不会中断 例如,来自M
transferMode=“Streamed”
),而不需要在内存中缓冲整个流,然后将其发送回
我知道(在WCF操作之外)流式传输数据的传统方法包括
void CopyStream(System.IO.Stream instream, System.IO.Stream outstream)
{
//read from the input stream in 4K chunks
//and save to output stream
const int bufferLen = 4096;
byte[] buffer = new byte[bufferLen];
int count = 0;
while ((count = instream.Read(buffer, 0, bufferLen)) > 0)
{
outstream.Write(buffer, 0, count);
}
}
我也希望这样做,只是outputstream
将是WCF返回类型。可能吗?如何使用transferMode=“Streamed”
?
使用WCF,如果要使用transferMode=“Streamed”
假设使用这样的伪代码:
Stream StreamAndReturn(System.IO.Stream instream)
{
Stream outstream = new MemoryStream();//instantiate outstream - probably should be buffered?
while ((count = instream.Read(buffer, 0, bufferLen)) > 0)
{
//some operation on instream that will
SomeOperation(instream,outstream);
}
return outstream; //obviously this will close break the streaming
}
我还尝试了NetTcpBinding
,将SessionMode
设置为SessionMode.Allowed
,希望有一个可以启动的会话,将流数据发送到服务,在单独的流中获取结果,然后使用OperationContext,检索与该服务实例关联的任何属性。但它没有保留会话信息,请参见下文:
我还应该设置InstanceContextMode=InstanceContextMode.PerSession
和ConcurrencyMode=ConcurrencyMode.Multiple
(见最后一段)
,但仍在等待答案。我想也许有更好的方法。我建议您创建两种方法:
- 一种将您的输入作为流并返回在服务器上生成的ID号的方法
- 另一个获取ID号并返回响应流的
您需要某种方式来协调服务器上的输入和输出,如果您将其放在负载平衡器(共享状态等)后面的多台服务器上,这将使其变得更加复杂,但它将允许您在请求端和响应端使用流式传输。是,但是怎么做呢?…这就是为什么我尝试了会话式方法(在另一篇SO文章中),这是使用
transferMode=“Streamed”
维护WCF服务状态的推荐方法。甚至无法设置为SessionMode.Required
或将其配置为ReliableSession
,因为流媒体不支持此功能。我唯一可以使用的会话是传输级别1NetTcpBinding
成为我的最佳选择。