我有一个批处理作业不断轮询Ftp服务器以查找目录中的文件列表。这是使用FtpWebRequest
和KeepAlive = true
实现的,以提高性能并消除对目标Ftp的一些压力。
这很有效,直到我手动将我的Ftp切换到离线状态。如果已建立连接(对于我假设的特定ServicePoint)GetResponseAsync()
似乎无限期挂起,即使在将Ftp切换回在线后也是如此。
我使用Timeout
和ReadWriteTimeout
无效,并且还尝试使用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