Wie eine FtpWebResponse Ausnahme in C # fangen
-
19-09-2019 - |
Frage
Ich baue eine FTP-Utility-Klasse in C #. In dem Fall, dass ein WebException
auf einem Anruf ausgelöst wird, FtpWebRequest.GetResponse()
, in meinem Fall ist die Ausnahme für die angeforderte Datei auf dem Remote-Server ist außerhalb des Gültigkeitsbereiches nicht vorhandenen geworfen der FtpWebResponse
Variable.
Aber selbst wenn ich die Variable außerhalb des try..catch
Block deklarieren erhalte ich einen Compiler-Fehler sagen: „Die Verwendung von nicht zugewiesenen lokalen Variablen‚response‘“, aber soweit ich das sagen kann, gibt es keine Möglichkeit, es zu vergeben, bis Sie die Antwort vergeben über die FtpWebRequest.GetResponse()
Methode.
Kann jemand bitte raten, oder bin ich etwas fehlt offensichtlich?
Danke!
Hier ist meine aktuelle Methode:
private void Download(string ftpServer, string ftpPath, string ftpFileName, string localPath,
string localFileName, string ftpUserID, string ftpPassword)
{
FtpWebRequest reqFTP;
FtpWebResponse response;
try
{
reqFTP = (FtpWebRequest)FtpWebRequest.Create(new Uri("ftp://"
+ ftpServer + "/" + ftpPath + "/" + ftpFileName));
reqFTP.Method = WebRequestMethods.Ftp.DownloadFile;
reqFTP.UseBinary = true;
reqFTP.Credentials = new NetworkCredential(ftpUserID,
ftpPassword);
/* HERE IS WHERE THE EXCEPTION IS THROWN FOR FILE NOT AVAILABLE*/
response = (FtpWebResponse)reqFTP.GetResponse();
Stream ftpStream = response.GetResponseStream();
FileStream outputStream = new FileStream(localPath + "\\" +
localFileName, FileMode.Create);
long cl = response.ContentLength;
int bufferSize = 2048;
int readCount;
byte[] buffer = new byte[bufferSize];
readCount = ftpStream.Read(buffer, 0, bufferSize);
while (readCount > 0)
{
outputStream.Write(buffer, 0, readCount);
readCount = ftpStream.Read(buffer, 0, bufferSize);
}
ftpStream.Close();
outputStream.Close();
response.Close();
}
catch (WebException webex)
{
/*HERE THE response VARIABLE IS UNASSIGNED*/
if (response.StatusCode == FtpStatusCode.ActionNotTakenFileUnavailable) {
//do something
}
}
Lösung
Als generische Art und Weise, dies zu lösen, weisen nur null
auf die Antwort und dann im catch-Block prüfen, ob es null
ist.
FtpWebResponse response = null;
try
{
...
}
catch (WebException webex)
{
if ((response != null) && (response.StatusCode == FtpStatusCode.ActionNotTakenFileUnavailable)) {
//do something
}
}
Doch in diesem speziellen Fall haben Sie alle Eigenschaften, die Sie auf der WebException
Instanz müssen (einschließlich der Serverantwort )!
Andere Tipps
Die richtige Lösung für das Problem finden Sie hier in dieser Frage zu finden:
Wie kann man überprüfen, ob die Datei auf FTP vor FtpWebRequest existiert
Kurz gesagt:
Ihre ‚Antwort‘ Variable wird immer null sein, weil der Fehler. Sie müssen die FtpWebResponse von ‚webex.Response‘ testen (Guss es), um den Statuscode zu erhalten.
Nun könnte man immer eine Variable zuweisen:
FtpWebRequest reqFTP = null;
FtpWebResponse response = null;