Pietr Podschinski
Pietr Podschinski

Reputation: 83

C# Program gets stuck in FtpWebResponse after server disconnects

I have a C# program that checks a ftp directory for new files every x seconds. If a new file is found it is downloaded. That works fine. If I start the program without running the ftp server the program loops and returns a message that the server cannot be reached. Then I start the server and the program connects as it should. But if I quit the ftp server again my program gets stuck in the FtpWebResponse.

I have a using statement block in a try catch block to close all connections.

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;
    }
}

I expect the program to reconnect to the server after the connection was lost but instead it gets stuck.

Any help and hints how to solve that issue is appreciated.

Upvotes: 0

Views: 1024

Answers (2)

Dmitry Pavlov
Dmitry Pavlov

Reputation: 28290

Use FtpWebRequest.GetResponse instead of FtpWebRequest.GetResponseAsync ( as GetResponseAsync is not overridden in FtpWebRequest and comes from the base WebRequest class, where it seems to it can't handle some specific FTP use cases)

If you need to await something just replace this:

FtpWebRequest request = ...
var response = (FtpWebResponse) await request.GetResponseAsync();
return response;

with that:

var response = (FtpWebResponse) request.GetResponse();
return await Task.FromResult(response);

Upvotes: 0

Pietr Podschinski
Pietr Podschinski

Reputation: 83

Just to let you know I solved the issue by implementing a workaround: Instead of using await request.GetResponseAsync() I use the normal GetResponse() method in another thread which works without any problems so far: await Task.Run(() => request.GetResponse())

Upvotes: 3

Related Questions