我有一个 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 通信层的某个位置。如果这是真的,我该如何以正确的方式在客户端使用流,以便客户端的内存不会被可能非常大的文件占用。
谢谢