我想将一个数据流(大文件> 2GB)发送到WCF服务,处理它然后将处理后的数据作为流(transferMode = "Streamed"
)返回,而不是在内存中缓冲整个流然后把它寄回去。
我知道流入和流出数据(在WCF操作之外)的传统方法涉及
这样,流流不会中断。
来自Microsoft示例:
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"
如果您想使用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,检索与该服务实例关联的任何属性。但它没有保留会话信息,见下文:
According to MSDN documentation我还应该设置InstanceContextMode = InstanceContextMode.PerSession
和ConcurrencyMode = ConcurrencyMode.Multiple
(参见最后一段)
For that, I Asked a question on SO,但仍在等待答案。我想也许有更好的方法来做到这一点。
答案 0 :(得分:-2)
我建议您创建两种方法:
你需要某种方式来协调服务器上的输入和输出,如果你将它放在负载均衡器后面的多个服务器上(共享状态和所有这些),它会使它更复杂一些,但它会允许您在请求方和响应方都使用流式传输。