Come catturare un'eccezione FtpWebResponse in C #
-
19-09-2019 - |
Domanda
Sto costruendo una classe di utilità FTP in C #. Nel caso in cui un WebException
è gettato su una chiamata a FtpWebRequest.GetResponse()
, nel mio caso l'eccezione viene generata per il file richiesto non esistente sul server remoto la variabile FtpWebResponse
è fuori portata.
Ma anche se io dichiaro la variabile all'esterno del blocco try..catch
ottengo un errore di compilazione dicendo: "L'uso della non assegnato variabile locale 'risposta'", ma per quanto ne so non c'è modo di assegnare fino a quando si assegna la risposta attraverso il metodo FtpWebRequest.GetResponse()
.
Qualcuno può consigliare, o mi sto perdendo qualcosa di ovvio?
Grazie!
Ecco il mio attuale metodo:
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
}
}
Soluzione
Come modo generico per risolvere questo, basta assegnare null
alla risposta prima e quindi controllare nel blocco catch se è null
.
FtpWebResponse response = null;
try
{
...
}
catch (WebException webex)
{
if ((response != null) && (response.StatusCode == FtpStatusCode.ActionNotTakenFileUnavailable)) {
//do something
}
}
Tuttavia, in questo caso specifico, si hanno tutte le proprietà è necessario per l'istanza WebException
(compreso il server di risposta )!
Altri suggerimenti
La soluzione corretta del problema può essere trovata in questa domanda qui:
Come verificare se il file esiste su FTP prima FtpWebRequest
In breve:
La variabile 'risposta' sarà sempre nullo a causa dell'errore. È necessario testare il FtpWebResponse da 'webex.Response' (cast) per ottenere lo StatusCode.
Bene si può sempre assegnare una variabile:
FtpWebRequest reqFTP = null;
FtpWebResponse response = null;