在一个WCF操作/调用中发送和返回连续的大型流

时间:2015-03-14 13:30:17

标签: c# wcf stream

我想将一个数据流(大文件> 2GB)发送到WCF服务,处理它然后将处理后的数据作为流(transferMode = "Streamed")返回,而不是在内存中缓冲整个流然后把它寄回去。

我知道流入和流出数据(在WCF操作之外)的传统方法涉及

  1. 在消费端,将流发送到(WCF服务)void方法,输入Stream和输出Stream作为参数。
  2. 在消费端,还有一个接收流来获取 传入,处理后的输出流
  3. 在该方法中,处理输入Stream然后写入 已处理的字节到输出流
  4. 这些处理过的字节是通过输出流
  5. 接收的字节

    这样,流流不会中断。

    来自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"

    ,请使用WCF,您不能拥有多个参数(或消息合同对象) of Stream type

    假设,像这样的伪代码:

    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.PerSessionConcurrencyMode = ConcurrencyMode.Multiple(参见最后一段)

    For that, I Asked a question on SO,但仍在等待答案。我想也许有更好的方法来做到这一点。

1 个答案:

答案 0 :(得分:-2)

我建议您创建两种方法:

  • 将您的输入作为流并返回在服务器上生成的ID号的文件。
  • 另一个获取ID号,并返回响应流。

你需要某种方式来协调服务器上的输入和输出,如果你将它放在负载均衡器后面的多个服务器上(共享状态和所有这些),它会使它更复杂一些,但它会允许您在请求方和响应方都使用流式传输。