Ich versuche, eine C#-Desktop-App zu schreiben, die auf einen FTP-Server zugreift und eine Datei abruft. Für die Entwicklung habe ich einen Remote-FTP-Server und einen in meinem LAN.
Ich kann mit Filezilla (Client) problemlos auf beide zugreifen.
Der C#-Code erzeugt einen http 426-Fehler, wenn eine Verbindung zu beiden Servern hergestellt wird. Ich habe die App mit den Schnittstellen System.Net und FluentFTP geschrieben. Identische Ergebnisse.
Die Windows 10-Firewall ist ausgeschaltet, aber wenn sie blockieren würde, würde sie sicherlich meinen Code und Filezilla (Client) blockieren.
Was könnte ich sonst noch übersehen?
Der vollständige Fehler lautet:
System.Net.WebException: Der Remote-Server hat einen Fehler zurückgegeben: (426) Verbindung geschlossen; Übertragung abgebrochen.
bei System.Net.FtpWebRequest.SyncRequestCallback(Object obj)
bei System.Net.FtpWebRequest.RequestCallback(Object obj)
bei System.Net.CommandStream.Dispose(Boolean dispose)
bei System.IO.Stream.Close()
at System.IO.Stream.Dispose()
bei System.Net.ConnectionPool.Destroy(PooledStream pooledStream)
bei System.Net.ConnectionPool.PutConnection(PooledStream pooledStream, Object owningObject, Int32creationTimeout, Boolean canReuse)
bei System.Net.FtpWebRequest.FinishRequestStage(RequestStage stage)
bei System.Net.FtpWebRequest.SyncRequestCallback(Object obj)
bei System.Net.FtpWebRequest.RequestCallback(Object obj)
bei System.Net.CommandStream.Abort(Exception e)
bei System.Net.CommandStream.CheckContinuePipeline()
bei System.Net.FtpWebRequest.DataStreamClosed(CloseExState closeState)
bei System.Net.FtpDataStream.System.Net.ICloseEx.CloseEx(CloseExState closeState)
bei System.Net.FtpDataStream.Dispose(Boolean dispose)
bei System.IO.Stream.Close()
bei System.Net.FtpDataStream.Read(Byte[]-Puffer, Int32-Offset, Int32-Größe)
bei System.IO.Stream.InternalCopyTo(Stream-Ziel, Int32-Puffergröße)
bei System.IO.Stream.CopyTo(Stream-Ziel)
bei DealFoundry_Scheduler.Form_Main.Process_FTP_Pull(Dokument-Feed) in C:\Development\DF24\DF24_Scheduler\DealFoundry Scheduler\Form_Main.cs:line 799
Code folgt, obwohl mein Bauchgefühl mir sagt, dass der Fehler woanders liegt:
Code: Select all
string ftpUrl = "ftp://192.168.1.10";
string username = "tester";
string password = "password";
// List files in remote directory
FtpWebRequest dirRequest = (FtpWebRequest)WebRequest.Create(ftpUrl);
dirRequest.Method = WebRequestMethods.Ftp.ListDirectory;
dirRequest.Credentials = new NetworkCredential(username, password);
dirRequest.UsePassive = true;
dirRequest.UseBinary = true;
dirRequest.EnableSsl = ftpUrl.ToLower().StartsWith("ftps");
dirRequest.KeepAlive = false;
using (FtpWebResponse dirResponse = (FtpWebResponse)dirRequest.GetResponse())
using (Stream dirStream = dirResponse.GetResponseStream())
using (StreamReader reader = new StreamReader(dirStream))
{
while (!reader.EndOfStream)
{
string fileName = reader.ReadLine();
string fileUrl = ftpUrl.TrimEnd('/') + "/" + fileName;
// Download file with retry logic
MemoryStream downloadStream = new MemoryStream();
FtpWebRequest fileRequest = (FtpWebRequest)WebRequest.Create(fileUrl);
fileRequest.Method = WebRequestMethods.Ftp.DownloadFile;
fileRequest.Credentials = new NetworkCredential(username, password);
fileRequest.UsePassive = true;
fileRequest.UseBinary = true;
fileRequest.KeepAlive = false;
fileRequest.Timeout = 60000;
fileRequest.ReadWriteTimeout = 60000;
fileRequest.EnableSsl = ftpUrl.ToLower().StartsWith("ftps");
using (FtpWebResponse fileResponse = (FtpWebResponse)fileRequest.GetResponse())
using (Stream fileStream = fileResponse.GetResponseStream())
{
fileStream.CopyTo(downloadStream);
downloadStream.Position = 0;
}
string fileExtension = Path.GetExtension(fileName).ToLower();
// Handle ZIP files
if (fileExtension == ".zip")
{
using (ZipArchive archive = new ZipArchive(downloadStream, ZipArchiveMode.Read))
{
foreach (var entry in archive.Entries)
{
using (var entryStream = entry.Open())
{
Upload_Stream(entryStream, Feed["Feed_Web_URL"], Feed["Feed_Account_Link"], Feed["Feed_Supplier_Link"]);
Post_FTP_Pull($"{DateTime.UtcNow:F} : Un-Zipped file {entry.FullName}");
}
}
}
}
else
{
Upload_Stream(downloadStream, fileName, Feed["Feed_Account_Link"], Feed["Feed_Supplier_Link"]);
}
Post_FTP_Pull($"{DateTime.UtcNow:F} : FTP Pull File : {fileName}");
// Delete source file if required
if ((bool)Feed["Feed_Pull_Delete"])
{
try
{
FtpWebRequest deleteRequest = (FtpWebRequest)WebRequest.Create(fileUrl);
deleteRequest.Method = WebRequestMethods.Ftp.DeleteFile;
deleteRequest.Credentials = new NetworkCredential(username, password);
deleteRequest.UsePassive = true;
deleteRequest.KeepAlive = false;
//*** disable during development using (FtpWebResponse deleteResponse = (FtpWebResponse)deleteRequest.GetResponse()) { }
}
catch (Exception Ex)
{
string[] Messages = new string[] { Ex.ToString() };
Error_Message.Send_Error_eMail(Messages);
}
}
}
}
Mobile version