WCF和流文件

圣战哈达德

我有一个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,调用服务函数的客户端也是如此

当transfermode设置为streamed时,这意味着服务在发送文件之前不会在内存中缓冲整个文件,对吗?但是接收到的(调用该函数的客户端)呢?如果我在接收方有类似以下的代码:

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通信层中的某个位置。如果是这样的话,我该如何正确使用客户端中的流,以免客户端的内存被超大文件占用。

谢谢

麦克风

当transfermode设置为streamed时,这意味着服务在发送文件之前不会在内存中缓冲整个文件,对吗?

正确的

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

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

在某种程度上,您的网络基础结构正在做一些数据包缓冲,但是在将整个流提供给客户端(或在客户端)之前,没有什么可以缓冲整个流。传输正在管理通信,可以使用maxBufferSize,maxBufferPoolSize和maxReceivedMessageSize属性在绑定中进行某种程度的控制。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章