因此,在过去,当我在开发文件传输应用程序时,我使用流式传输,而且我似乎能够至少在本地机器之间快速传输文件。
尽管文件非常大,超过 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 左右或更低。
第二次编辑:
我再次建立了一个流媒体系统,但利用了我的块。所以我正在流式传输整个较大文件的块。
通过 Internet 上的 64mb 块,我在 11 分 30 秒内向自己传输了一个 862mb 的文件。我的最大下载速度为 25mbps,上传速度约为 5mbps。我认为这很不错。
很遗憾,我无法通过缓冲流模式达到这些速度。
为什么是这样?为什么会有这样的限制?为什么流媒体的速度如此之快?
更多信息
将块大小从 64 减小到 8,然后减小到 4,最后减小到 2,产生了越来越快的结果,对于 2mb 的块大小,在 2 分钟内传输了 862mb的文件。使用缓冲传输模式,我永远无法获得这样的结果。