所以在过去我正在处理文件传输应用程序时,我使用了流媒体,而且我似乎能够以最快的速度传输文件,至少可以传输到本地计算机上。
我遇到了问题,虽然文件非常大,超过4GB(我希望任何文件大小都可以,从小到大),并且需要考虑将文件分成更小的块。所以现在我正在研究我的程序的不同版本,并成功地将一个大文件拆分成由某个块大小指定的块(在这种情况下为4MB)。
我通过回调方法将这些文件传输到客户端,但与流式传输相比,传输似乎需要很长时间。
WCF中是否有某些设置可以真正提高邮件传输的性能,或者可能会阻碍我的性能?
public void RequestFile()
{
IFileTransferCallback callback = OperationContext.Current.GetCallbackChannel<IFileTransferCallback>();
while (chunkedFile.MoreChunks)
{
callback.ReceiveFile(chunkedFile.NextChunk(), chunkedFile.MoreChunks);
}
host.Close();
}
这些是我现在正在使用的绑定设置。有些只是随意设置。
NetTcpBinding binding = new NetTcpBinding(SecurityMode.None, true);
binding.MaxBufferPoolSize = int.MaxValue;
binding.ReaderQuotas.MaxDepth = int.MaxValue;
binding.ReaderQuotas.MaxStringContentLength = int.MaxValue;
binding.ReaderQuotas.MaxArrayLength = int.MaxValue;
binding.ReaderQuotas.MaxBytesPerRead = int.MaxValue;
binding.ReaderQuotas.MaxNameTableCharCount = int.MaxValue;
binding.MaxBufferSize = int.MaxValue;
binding.MaxConnections = 500;
binding.MaxReceivedMessageSize = int.MaxValue;
binding.TransferMode = TransferMode.Buffered;
binding.SendTimeout = new TimeSpan(0, 5, 0);
binding.ReceiveTimeout = new TimeSpan(0, 5, 0);
BindingElementCollection collection = binding.CreateBindingElements();
collection.Add(new MtomMessageEncodingBindingElement());
UnityContainer.RegisterInstance(typeof(Binding), binding);
修改
我一直在努力寻找提高速度的各种选择。当我运行服务器localhost时,它可以在几秒钟内完成一个700mb的文件,显然......但是当我使用我的外部IP时,它需要花费相当多的时间,比我的15mbps上传速度应该允许的时间更长。
发生了什么事? WCF的速度是否存在硬性上限?我该如何解锁?当然它可以比现在更快。我不能老实说我的数据传输速度有多快,因为我还不知道如何计算它,但它可能大约在250kbps左右。
第二次修改:
我再次设置了一个流媒体系统,但是利用了我的块。所以我正在整理更大的文件。
通过互联网上的64mb块我只需要在11分30秒内将一个862mb的文件流式传输给自己。我的下载速度最高为25mbps,上传速度约为5mbps。我觉得这很不错。
令人遗憾的是,我无法通过缓冲流模式获得这些速度。
这是为什么?为何如此限制?为什么流媒体这么快?
更多信息
将块大小从64减少到8然后再减少到4并最终减少到2会产生更快更快的结果,对于2mb块大小,文件传输 862mb,2分钟。我无法通过缓冲传输模式获得这样的任何东西。