Hallo zusammen,
ich habe hier ein Beispielprogramm, an dem ich ein Problem verdeutlichen möchte, was auftritt, wenn ich versuche, eine FTPS-Verbindung zu einem FTP-Server aufzubauen, der dies unterstützt. Der FTP-Server unterstützt zum Einen eine unverschlüsselte Verbindung über Port 21 und eine Verbindung mittels "FTPS – FTP über impliziertes TLS/SSL" über Port 990. Ich habe nun folgendes Beispiel-Konsolenprogramm, was sich an dem Server anmelden und eine Beispieldatei hochladen soll. Das Programm enthält einige STOP-Anweisungen, die natürlich nur zu Debuggingzwecken enthalten sind, und ich lasse das Programm direkt über die Entwicklungsumgebung im Debugging laufen.
Den Port habe ich innerhalb der ADDRESS-Konstante um URI hinterlegt - ich weiß nicht, ob dies so korrekt ist, allerdings sind die Auswirkungen etwas anders, wenn ich hier den Port 990 angebe, im Gegensatz dazu, wenn ich keinen Port mit angebe.
Lasse ich das Beispielprogramm nun laufen, tritt bei der Zeile...
Dim requestStream As IO.Stream = ftpWebRequest.GetRequestStream()
...nach einer Zeit eine WebException "Timeout" auf:
Timeout für den Vorgang wurde überschritten.
Innerhalb der Exception steht ein WebResponse-Objekt über die Eigenschaft "Response" zur Verfügung, was in ein Objekt vom Typ "FtpWebResponse" gecastet werden kann. Dies enthält aber leider keinerlei weitere Angaben in den Eigenschaften.
Lasse ich das Programm ohne Angabe eines Ports laufen, erhalte ich bei oben genannter Zeile sofort eine WebException:
Der Remoteserver hat einen Fehler zurückgegeben: (530) Nicht angemeldet.
Das WebResponse-Objekt in der Ausnahme zeigt dann Folgendes:
{System.Net.FtpWebResponse}
BannerMessage: "220 FTP-Server ready "
ContentLength: 0
ContentType: {"Die Eigenschaft wird von der Klasse nicht implementiert."}
ExitMessage: ""
Headers: {System.Net.WebHeaderCollection}
IsFromCache: False
IsMutuallyAuthenticated: False
LastModified: #12:00:00 AM#
ResponseUri: {System.Uri}
StatusCode: NotLoggedIn {530}
StatusDescription: "530 Please login with USER and PASS. "
WelcomeMessage: ""
Hat jemand eine Idee, was hier falsch ist, und wie ich mich an diesen FTP-Server mittels eines impliziten FTP over SSL anmelden kann?
Vielen Dank im Voraus für Eure Hilfe!
Gruß
Harry
ich habe hier ein Beispielprogramm, an dem ich ein Problem verdeutlichen möchte, was auftritt, wenn ich versuche, eine FTPS-Verbindung zu einem FTP-Server aufzubauen, der dies unterstützt. Der FTP-Server unterstützt zum Einen eine unverschlüsselte Verbindung über Port 21 und eine Verbindung mittels "FTPS – FTP über impliziertes TLS/SSL" über Port 990. Ich habe nun folgendes Beispiel-Konsolenprogramm, was sich an dem Server anmelden und eine Beispieldatei hochladen soll. Das Programm enthält einige STOP-Anweisungen, die natürlich nur zu Debuggingzwecken enthalten sind, und ich lasse das Programm direkt über die Entwicklungsumgebung im Debugging laufen.
VB.NET-Quellcode
- Module Module1
- Private Const USER = "USER"
- Private Const PASSWORD = "PASSWORD"
- Private Const ADDRESS = "ftp://server.domain:990/test.txt"
- Private Const FILE = "C:\Temp\test.txt"
- Sub Main()
- Try
- Dim credentials As New Net.NetworkCredential(USER, PASSWORD)
- Dim ftpWebRequest As Net.FtpWebRequest
- ftpWebRequest = Net.FtpWebRequest.Create(ADDRESS)
- ftpWebRequest.EnableSsl = True
- ftpWebRequest.Credentials = credentials
- ftpWebRequest.Method = Net.WebRequestMethods.Ftp.UploadFile
- Net.ServicePointManager.ServerCertificateValidationCallback = New Net.Security.RemoteCertificateValidationCallback(AddressOf ValidateServerCertificate)
- Dim requestStream As IO.Stream = ftpWebRequest.GetRequestStream()
- Dim fileStream As IO.Stream = IO.File.OpenRead(FILE)
- Const bufferLength As Integer = 2048
- Dim buffer(bufferLength) As Byte
- Dim count As Integer = 0
- Dim readBytes As Integer = 0
- Do
- readBytes = fileStream.Read(buffer, 0, bufferLength)
- requestStream.Write(buffer, 0, readBytes)
- count += readBytes
- Loop While readBytes <> 0
- requestStream.Close()
- fileStream.Close()
- Catch ex As Net.WebException
- Dim response As Net.FtpWebResponse = ex.Response
- Stop
- Catch ex As Exception
- Stop
- End Try
- End Sub
- Public Function ValidateServerCertificate( _
- ByVal sender As Object, _
- ByVal certificate As Security.Cryptography.X509Certificates.X509Certificate, _
- ByVal chain As System.Security.Cryptography.X509Certificates.X509Chain, _
- ByVal sslPolicyErrors As System.Net.Security.SslPolicyErrors _
- ) As Boolean
- If sslPolicyErrors = Net.Security.SslPolicyErrors.None Then
- Return True
- End If
- Console.WriteLine("Certificate error {0}", sslPolicyErrors)
- Return False
- End Function
- End Module
Den Port habe ich innerhalb der ADDRESS-Konstante um URI hinterlegt - ich weiß nicht, ob dies so korrekt ist, allerdings sind die Auswirkungen etwas anders, wenn ich hier den Port 990 angebe, im Gegensatz dazu, wenn ich keinen Port mit angebe.
Lasse ich das Beispielprogramm nun laufen, tritt bei der Zeile...
Dim requestStream As IO.Stream = ftpWebRequest.GetRequestStream()
...nach einer Zeit eine WebException "Timeout" auf:
Timeout für den Vorgang wurde überschritten.
Innerhalb der Exception steht ein WebResponse-Objekt über die Eigenschaft "Response" zur Verfügung, was in ein Objekt vom Typ "FtpWebResponse" gecastet werden kann. Dies enthält aber leider keinerlei weitere Angaben in den Eigenschaften.
Lasse ich das Programm ohne Angabe eines Ports laufen, erhalte ich bei oben genannter Zeile sofort eine WebException:
Der Remoteserver hat einen Fehler zurückgegeben: (530) Nicht angemeldet.
Das WebResponse-Objekt in der Ausnahme zeigt dann Folgendes:
{System.Net.FtpWebResponse}
BannerMessage: "220 FTP-Server ready "
ContentLength: 0
ContentType: {"Die Eigenschaft wird von der Klasse nicht implementiert."}
ExitMessage: ""
Headers: {System.Net.WebHeaderCollection}
IsFromCache: False
IsMutuallyAuthenticated: False
LastModified: #12:00:00 AM#
ResponseUri: {System.Uri}
StatusCode: NotLoggedIn {530}
StatusDescription: "530 Please login with USER and PASS. "
WelcomeMessage: ""
Hat jemand eine Idee, was hier falsch ist, und wie ich mich an diesen FTP-Server mittels eines impliziten FTP over SSL anmelden kann?
Vielen Dank im Voraus für Eure Hilfe!
Gruß
Harry