0

我有一个 WCF 服务,它使用以下方法流式传输文件:

public class GetFileService : IGetFileService
{
    public GetFileResponse GetFile(GetFileRequest request)
    {
        var fileStream = new FileStream(request.FileName, FileMode.Open, FileAccess.Read);
        return new GetFileResponse
        {
            StreamResult = fileStream
        };
    }
}

[MessageContract]
public class GetFileResponse
{
    [MessageBodyMember(Order = 1)]
    public Stream StreamResult { get; set; }
}

我的 web.config 有一个带有 transferMode="Streamed" 的 basicHttpBinding,调用服务函数的客户端也是如此

当传输模式设置为流式传输时,这意味着服务在发送之前不会将整个文件缓存在内存中,对吧?但是收到的(调用函数的客户端)呢?如果我在接收方有如下代码:

GetFileServiceClient getFileService = new GetFileServiceClient();
using ( Stream stream = getFileService.GetFile(@"c:\Temp\pics.zip") )
{
    const int bufferSize = 2048;
    byte[] buffer = new byte[bufferSize];
    using (FileStream outputStream = new FileStream(@"C:\Temp\pics2.zip", FileMode.Create, FileAccess.Write))
    {
        int bytesRead = stream.Read(buffer, 0, bufferSize);
        while (bytesRead > 0)
        {
            outputStream.Write(buffer, 0, bytesRead);
            bytesRead = stream.Read(buffer, 0, bufferSize);
        }
        outputStream.Close();
     }
 }

客户端在调用中是否没有收到整个文件

 getFileService.GetFile(@"c:\Temp\pics.zip")

还是接收流指针并且仅当在 while 循环中执行对 Read 的调用时才流式传输文件?不知怎的,我觉得这很难消化。我感觉整个文件是通过网络发送的,并且位于 WCF 通信层的某个位置。如果这是真的,我该如何以正确的方式在客户端使用流,以便客户端的内存不会被可能非常大的文件占用。

谢谢

4

1 回答 1

1

当传输模式设置为流式传输时,这意味着服务在发送之前不会将整个文件缓存在内存中,对吧?

正确的

但是收到的(调用函数的客户端)呢?如果我在接收方有如下代码,客户端在调用中是否接收到整个文件

getFileService.GetFile(@"c:\Temp\pics.zip")

在某种程度上,您的网络基础设施正在执行一定数量的数据包缓冲,但是在将整个流提供给客户端(或客户端)之前,没有任何东西可以缓冲整个流。传输管理通信,并且可以使用 maxBufferSize、maxBufferPoolSize 和 maxReceivedMessageSize 属性在绑定中进行一定程度的控制

于 2016-04-07T17:04:03.023 回答