Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/304.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在一个WCF操作/调用中发送和返回连续的大流_C#_Wcf_Stream - Fatal编程技术网

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

C# 在一个WCF操作/调用中发送和返回连续的大流,c#,wcf,stream,C#,Wcf,Stream,我想向WCF服务发送一个数据流(大文件>2GB),对其进行处理,然后将处理后的数据作为流返回(transferMode=“Streamed”),而不需要在内存中缓冲整个流,然后将其发送回 我知道(在WCF操作之外)流式传输数据的传统方法包括 在使用端,使用输入流和输出流作为参数向(WCF服务)void方法发送流 在消费端,还具有接收流以获取 传入的、已处理的输出流 在该方法中,处理该输入流,然后写入 将已处理的字节发送到输出流 这些处理的字节是通过输出流接收的 这样,水流就不会中断 例如,来自M

我想向WCF服务发送一个数据流(大文件>2GB),对其进行处理,然后将处理后的数据作为流返回(
transferMode=“Streamed”
),而不需要在内存中缓冲整个流,然后将其发送回

我知道(在WCF操作之外)流式传输数据的传统方法包括

  • 在使用端,使用输入流和输出流作为参数向(WCF服务)void方法发送流
  • 在消费端,还具有接收流以获取 传入的、已处理的输出流
  • 在该方法中,处理该输入流,然后写入 将已处理的字节发送到输出流
  • 这些处理的字节是通过输出流接收的
  • 这样,水流就不会中断

    例如,来自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”

    使用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
    ,因为流媒体不支持此功能。我唯一可以使用的会话是传输级别1
    NetTcpBinding
    成为我的最佳选择。