我有一个服务,它有一个方法从客户端向服务发送文件。我注意到,当我在同一台机器上运行客户端和服务,并且我要发送的文件也在本地机器中时,所有工作都非常快。
但是,我的客户端和服务都在同一台机器上,但文件在其他计算机上,那么速度很慢。
如果我将文件从一台计算机复制到另一台计算机,速度很快,所以问题似乎不是带宽。
我尝试使用tcp和basicHttp Binding,但结果是一样的。
当我尝试发送客户端在其他计算机上时,也会出现此问题。
感谢。
编辑:如果我打开任务管理器,在计算机的网络选项卡中运行客户端,我可以看到网络的使用率约为0.5%。为什么呢?
答案 0 :(得分:2)
用于传输大文件的WCF不是最佳方法,因为WCF有很多层和开销会增加并导致文件传输延迟。更重要的是,您可能没有编写WCF服务来连续读取字节块并写入响应。您可能正在执行File.ReadAll然后只返回整个字符串,这将导致服务器上大量的同步读取,大量的内存分配,然后将大字符串写入WCF缓冲区,然后写入IIS缓冲等等。
传输大文件的最佳方法是使用HttpHandlers。您可以使用Response.TransmitFile传输文件,IIS将以最佳方式传输文件。否则,您可以一次读取8k,然后写入响应流,并在每写8k后写入调用Flush 。
如果因为任何奇怪的原因你不能去HttpHandler,你能告诉我WCF代码吗?
另一件事。您可能期望在IIS处于图片中时无法实现的性能。首先,如果您只是直接在网站上托管文件并通过执行WebClient.downloadString下载文件,您应该测量IIS传输文件所需的时间。
另一件事是,你是如何下载的?通过浏览器?或通过客户端代码?如果您尝试一次性传输整个文件并尝试将其保存在字符串中,则客户端代码也可能不是最理想的。例如,WebClient.DownloadString将是最糟糕的方法。