当Ftp连接关闭时,GetResponseAsync()挂起

时间:2018-06-11 15:15:22

标签: c# .net asynchronous ftp ftpwebrequest

我有一个批处理作业不断轮询Ftp服务器以查找目录中的文件列表。这是使用FtpWebRequestKeepAlive = true实现的,以提高性能并消除对目标Ftp的一些压力。

这很有效,直到我手动将我的Ftp切换到离线状态。如果已建立连接(对于我假设的特定ServicePoint)GetResponseAsync()似乎无限期挂起,即使在将Ftp切换回在线后也是如此。

我使用TimeoutReadWriteTimeout无效,并且还尝试使用CancellationTokenSource CancelAfter()注册一个回调,该回调又调用Abort()要求,但没有运气。当底层Tcp连接崩溃时,请求可能会超时,但我没有等待那么久。在单独的线程中运行Abort也不起作用。似乎一些潜在的代码陷入了无法逃脱的状态。

切换到GetResponse(),即非异步,按预期工作,请求失败并出现异常。我错过了一些设置吗?我不想使用KeepAlive = false,即使它解决了这部分问题。

while (true)
{
    try
    {
        Console.WriteLine("Requesting file listing via FTP");

        var request = (FtpWebRequest)WebRequest.Create("ftp://127.0.0.1:21");
        request.Credentials = new NetworkCredential(userName: "user", password: "pwd");
        request.Method = WebRequestMethods.Ftp.ListDirectory;
        request.Timeout = 5000;
        request.ReadWriteTimeout = 5000;
        request.UseBinary = true;
        request.KeepAlive = true;

        // This call will 'hang' indefinitely:
        using (var response = await request.GetResponseAsync())
        using (var responseStream = response.GetResponseStream())
        using (var reader = new StreamReader(responseStream))
        {
            var files = await reader.ReadToEndAsync();
            Console.WriteLine(files);
        }
    }
    catch (Exception ex)
    {
        Console.WriteLine("Ftp Error: " + ex.Message);
    }

    await Task.Delay(1000);
}

使用.Net Framework 4.7.1和VS 2017 15.7.3

0 个答案:

没有答案