Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/298.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# 下载大量小文件_C#_Wcf_Client Server - Fatal编程技术网

C# 下载大量小文件

C# 下载大量小文件,c#,wcf,client-server,C#,Wcf,Client Server,我希望改进WCF客户机/服务器,使其能够以比当前更快的速度处理大量小文件 我已经编写了一个WCF客户端和一个服务器,用于在网络上移动文件 我通过从客户端调用服务器(发送我想下载的文件名作为参数),然后让服务器返回一个流来实现它 简化示例: //CLIENT CODE>> Stream stream = syncService.GetStream(fileName); //<<CLIENT CODE //SERVER CODE>> public Stream

我希望改进WCF客户机/服务器,使其能够以比当前更快的速度处理大量小文件

我已经编写了一个WCF客户端和一个服务器,用于在网络上移动文件

我通过从客户端调用服务器(发送我想下载的文件名作为参数),然后让服务器返回一个流来实现它

简化示例:

//CLIENT CODE>>
Stream stream = syncService.GetStream(fileName);
//<<CLIENT CODE

//SERVER CODE>>
public Stream GetStream(string fileName)
{
   string filePathOnServer = ServerService.Service1.SERVER_FILES_PATH + fileName;
   return File.OpenRead(filePathOnServer);
}
//<<SERVER CODE
//客户端代码>>
Stream=syncService.GetStream(文件名);
//
公共流GetStream(字符串文件名)
{
字符串filepathnserver=ServerService.Service1.SERVER\u FILES\u PATH+fileName;
返回File.OpenRead(filepathnserver);
}

// 我会将您的WCF方法更改为接受一组文件名(即
List
string[]
),然后将它们打包。我知道在制作ZIP文件时效果很好

将ZIP文件流式传输回客户机,客户机将依次解压并处理这些文件


一个更大的文件传输速度应该快几个数量级,带宽也应该更轻(因为这样可以减少与网络相关的开销),更不用说一个WCF调用,而不是一个文件一个调用(一个巨大的瓶颈)。

我会更改您的WCF方法以接受一组文件名(即
列表
字符串[]
),然后打包。我知道在生成ZIP文件时效果很好

将ZIP文件流式传输回客户机,客户机将依次解压并处理这些文件


一个更大的文件传输速度应该快几个数量级,带宽也应该更轻(因为这样可以减少与网络相关的开销),更不用说一个WCF调用,而不是一个文件一个(一个巨大的瓶颈).

为什么不传递一个文件列表作为参数,并在一个流中返回所有文件。只需在流中为每个文件添加一个文件长度,然后解析并拆分返回的数据。@Pete感谢您的回复。这是我目前正在考虑的,但我认为可能会有更好的选择。我将尝试在看看是否有人有其他建议。您不指定服务的托管方式,但如果它托管在IIS中,则必须为每个WCF方法调用创建并打开一个HTTP连接。当您处理大量调用时,这会带来很大的开销。@Pete是的,这是正确的。我认为这就是我的大部分开销所在,因此我定义了首先,我们需要减少函数调用的数量。为什么不将文件列表作为参数传递,并在一个流中返回所有文件。只需在流中为每个文件添加一个文件长度,然后解析并拆分返回的数据。@Pete感谢您的回复。这是我目前正在考虑的,但我认为可能会有更好的结果er选项。我将尝试编写代码,同时等待是否有人提出其他建议。您不指定服务的托管方式,但如果它托管在IIS中,则必须为每个WCF方法调用创建并打开一个HTTP连接。当您处理大量调用时,这会带来很大的开销。@Pete是的,这是正确的。I think这是我大部分开销的地方,所以我肯定需要减少函数调用的数量。谢谢你的建议。我正在尽最大努力避免压缩文件,除非我必须这样做;但是你是对的,这应该可以解决这个问题。甚至可以禁用压缩。压缩文件只是一种容器格式。@usr同意,但这主要取决于文件的内容(TXT文件会被压缩很多,而JPEG压缩得不多),因为即使压缩数据“浪费”了一些时间,传输速度也会更快(即压缩需要3秒,但流式传输较小的zip文件可以节省20秒…这是一个胜利)谢谢你的建议。除非我万不得已,否则我会尽力避免压缩文件;但你是对的,这应该可以解决这个问题。你甚至可以禁用压缩。压缩文件只是一种容器格式。@usr同意,但它主要取决于文件的内容(TXT文件会被压缩很多,而JPEG压缩得很少),因为即使压缩数据“浪费”了一些时间,传输速度也会更快(即压缩需要3秒,但流式传输较小的压缩文件可以节省20秒……这是一个胜利)