首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >服务器断开连接后,C#程序被困在FtpWebResponse中

服务器断开连接后,C#程序被困在FtpWebResponse中
EN

Stack Overflow用户
提问于 2019-08-01 19:13:42
回答 2查看 343关注 0票数 0

我有一个C#程序,它每隔x秒检查一次ftp目录中的新文件。如果找到新文件,则下载该文件。这很好用。如果我在未运行ftp服务器的情况下启动程序,程序将循环并返回一条消息,指出无法访问服务器。然后我启动服务器,程序就可以正常连接了。但是如果我再次退出ftp服务器,我的程序就会卡在FtpWebResponse中。

我在try catch块中有一个using语句块来关闭所有连接。

代码语言:javascript
复制
while (true)
{
    //...
    FtpFileList = null;
    while (FtpFileList == null)
    {
        FtpFileList = await GetFtpFileList(adress, user, password);
        await Task.Delay(3000);
    }
    await Task.Delay(27000);
    //...
}


public static async Task<List<string>> GetFtpFileList(string address, string user, string password)
{
    try
    {
        List<string> returnValue = new List<string>();
        FtpWebRequest request = (FtpWebRequest)WebRequest.Create(address);
        request.Method = WebRequestMethods.Ftp.ListDirectory;
        request.Credentials = new NetworkCredential(user, password);
        using (FtpWebResponse response = (FtpWebResponse)await request.GetResponseAsync()) //The program gets stuck here
        {
            Stream responseStream = response.GetResponseStream();
            StreamReader reader = new StreamReader(responseStream);
            while (reader.Peek() >= 0)
            {
                returnValue.Add(reader.ReadLine());
            }
        }
        AddToLogFile(DateTime.Now + ": " + "FTP directory updated");
        return returnValue;
    }
    catch (WebException e)
    {
        AddToLogFile(DateTime.Now + ": " + e.Message);
        return null;
    }
}

我希望程序在连接丢失后重新连接到服务器,但它却卡住了。

任何关于如何解决这个问题的帮助和提示都是值得感谢的。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-08-19 19:50:38

为了让您知道,我通过实现一个变通方法解决了这个问题:我在另一个线程中使用普通的GetResponse()方法,而不是使用await request.GetResponseAsync(),到目前为止,这个线程没有出现任何问题:await Task.Run(() => request.GetResponse())

票数 3
EN

Stack Overflow用户

发布于 2021-09-15 13:34:34

使用FtpWebRequest.GetResponse而不是FtpWebRequest.GetResponseAsync (因为GetResponseAsyncFtpWebRequest中没有被覆盖,它来自基本的WebRequest类,在那里它似乎不能处理一些特定的FTP用例)

如果您需要等待,只需替换以下内容:

代码语言:javascript
复制
FtpWebRequest request = ...
var response = (FtpWebResponse) await request.GetResponseAsync();
return response;

在此基础上:

代码语言:javascript
复制
var response = (FtpWebResponse) request.GetResponse();
return await Task.FromResult(response);
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/57307761

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档