SFTPClient hangs forever in Windows- and Linux-based Azure App Service
Nadie ha tomado este issue todavía.
- Lenguaje dominante
- C#
- Estrellas
- 4.4k
- Forks
- 993
- Merge medio
- 9 d 21 h
- PR fusionados (30 d)
- 1
Descripción
We use an ASP.NET Core 3.1 Background Service to watch and import files from an Sftp Server.
We encountered two issues:
ListDirectoryAsynchangs forever (SSH.NET 2016.1.0)Connecthangs forever (SSH.NET 2020.0.0-beta1)- After running it for about 2 days successfully)
I created a little repro application were calls to ListDirectoryAsync and Connect are involved.
public class BackgroundWorker : BackgroundService
{
private readonly ILogger<BackgroundWorker> _logger;
public BackgroundWorker(ILogger<BackgroundWorker> logger)
{
_logger = logger;
}
protected override async Task ExecuteAsync(CancellationToken stoppingToken)
{
do
{
var host = "";
var username = "";
var password = "";
var uri = new Uri(host);
var path = "FI/Sample";
var parsedHost = uri.Host;
_logger.LogInformation($"{DateTime.Now} - Creating new client ...");
var parsedPort = uri.Port;
var connectionInfo = new PasswordConnectionInfo(parsedHost, parsedPort, username, password)
{
Timeout = TimeSpan.FromSeconds(120),
};
var client = new SftpClient(connectionInfo);
_logger.LogInformation($"{DateTime.Now} - Client created.");
client.OperationTimeout = TimeSpan.FromMinutes(3);
_logger.LogInformation($"{DateTime.Now} - Connecting ...");
client.Connect();
_logger.LogInformation($"{DateTime.Now} - Connected");
var stopwatch = new Stopwatch();
stopwatch.Start();
_logger.LogInformation($"{DateTime.Now} - ListDirectoryAsync ...");
var immutableArray = (await client.ListDirectoryAsync(path))
.Where(x => x.IsRegularFile)
.Select(x => new { x.Name, x.LastWriteTimeUtc })
.ToImmutableArray();
_logger.LogInformation($"{DateTime.Now} - Done({immutableArray.Length}) {stopwatch.ElapsedMilliseconds}ms");
_logger.LogInformation($"{DateTime.Now} - Disposing ...");
client.Dispose();
connectionInfo.Dispose();
_logger.LogInformation($"{DateTime.Now} - Disposed.");
await Task.Delay(1000);
} while (true);
}
}
Further findings:
- We could see that both Linux and Windows-based App Services hung at the same time. So it seems that the Sftp Server might have had an issue at that time. Nevertheless SSH.NET should handle this with a timeout.
- We could also see that if we increase our polling interval hanging process were less frequent.
If you need more information, let me know.
Update:
Seems like https://github.com/sshnet/SSH.NET/blob/cefdc203d98cd890815e029bc759bc43ec5a9643/src/Renci.SshNet/Session.cs#L1945 is the problem.
Guía de contribución
Primeros pasos
- Lee el issue completo y luego la guía de contribución del proyecto.
- Comenta en el issue que vas a ocuparte — evita que dos personas hagan lo mismo.
- Haz un fork del repositorio y trabaja en una rama.
- Abre un pull request que haga referencia al número del issue.
Línea de trabajo
Comienza con el BackgroundWorker de reproducción mostrado en el issue e inspecciona Session.cs alrededor de la línea enlazada 1945, centrándote en las rutas Connect y ListDirectoryAsync. Reproduce el bloqueo de Azure App Service o un servidor SFTP no disponible y verifica después que la operación afectada respeta el timeout configurado en lugar de quedarse bloqueada indefinidamente.
Escrito por el modelo de indexación a partir del texto del issue.
Evaluación
- Stack tecnológico
- csharp
- Área
- networking
- Tipo de issue
- Error
- Dificultad
- 4/5
- Tiempo estimado
- 3-5 días
- Estado de actividad
- Estancado
- Claridad
- Bastante claro
- Aptitud para principiantes
- 35/100