Can't upload large file over SFTP (SshOperationTimeoutException)

未关闭
#103 7 条评论 0 个 reaction 已指派 0 人 在 GitHub 查看

还没有人认领这个 Issue。

评估

难度
4/5
预计耗时
3-5 天
新手友好度
35/100
Issue 类型
缺陷
描述清晰度
需要澄清
活跃度
停滞
技术栈
csharp
领域
networking

调研方向

从经过 SftpClient.InternalUploadFile、SftpSession.RequestWrite、Channel.SendData 和 Session.WaitOnHandle 的堆栈跟踪路径开始。重现一次持续时间接近报告时长的大型 SFTP 上传,并确定会话超时发生的原因;完成标准是传输在不超时的情况下完成,并且该行为由适当的回归测试覆盖。

由索引模型根据 Issue 内容生成。

描述

For uploading .csv file over SFTP I use SSH.NET (version 2016.0.0).

The file which needs to be send is rather large (~7GB), and in about an hour after the uploading started it throws the exception Renci.SshNet.Common.SshOperationTimeoutException: Session operation has timed out.

Here is my actual uploading code.

using (SftpClient client = new SftpClient(command.FtpHost, command.UserName, command.Password))
{
    client.Connect();
    client.ChangeDirectory(command.FtpTargetFolder);

    // played a lot with BufferSize property
    // tried to use the default value, tried 4*1024 and 8*1024
    client.BufferSize = 2 * 1024; 

    using (FileStream fileStream = new FileStream(command.LocalFilePath, FileMode.Open))
    {
        client.UploadFile(fileStream, PrepareFileName(command.LocalFilePath));
    }
    client.Disconnect();
}

But this code works fine with smaller (tried with 1-4GB files) files than my desirable one (~7GB). I thought that it could depends on BufferSize, but playing with this property didn't fix the problem.

Here is the issue's stack trace.

Renci.SshNet.Common.SshOperationTimeoutException: Session operation has timed out
at Renci.SshNet.Session.WaitOnHandle(WaitHandle waitHandle, TimeSpan timeout)
at Renci.SshNet.Channels.Channel.GetDataLengthThatCanBeSentInMessage(Int32 messageLength)
at Renci.SshNet.Channels.Channel.SendData(Byte[] data, Int32 offset, Int32 size)
at Renci.SshNet.Sftp.SftpSession.SendRequest(SftpRequest request)
at Renci.SshNet.Sftp.SftpSession.RequestWrite(Byte[] handle, UInt64 offset, Byte[] data, Int32 length, AutoResetEvent wait, Action'1 writeCompleted)
at Renci.SshNet.SftpClient.InternalUploadFile(Stream input, String path, Flags flags, SftpUploadAsyncResult asyncResult, Action'1 uploadCallback)

Also I've noticed that usually uploading throws the error in 1 hour after start and by that time it's uploaded ~80-90% of entire file (because I see not fully uploaded files in my destination SFTP folder).

Does someone has an idea why it's happening?
Btw I've asked StackOverflow question regarding that: http://stackoverflow.com/questions/40158501/cant-upload-large-file-over-sftp
Thanks in advance.

主要语言
C#
星标
4.4k
派生
993
平均合并
9 天 21 小时
30 天内合并 PR
1

贡献指南

打开贡献指南

从这里开始

  1. 先读完整个 Issue,再读项目的贡献指南。
  2. 在 Issue 下留言说明你要接手 —— 这能避免两个人做同样的事。
  3. Fork 仓库,在一个分支上完成修改。
  4. 提交 Pull Request,并在描述里引用这个 Issue 编号。

sshnet/SSH.NET 的其他 Issue

查看 sshnet/SSH.NET 的全部 Issue

相似的 Issue

更多 C# Issue

把新 issue 发到你的邮箱

精选适合新手参与的 GitHub issue 摘要。