Возникают ошибки при загрузке изображений на FTP

Я получаю много разных проблем в этой функции:

public static bool UploadToFTP(string strFileName, string strFolderName)
        {
            bool isUploaded = false;
            string strFilename = string.Empty;
            string strFtpURI = string.Empty;
            string strFtpUserId = string.Empty;
            string strFtpPassword = string.Empty;
            byte[] buffer = null;
            FileInfo oFileInfo = null;
            FileStream oFileStream = null;
            FtpWebRequest oFtpWebRequest = null;

            try
            {
                strFilename = strFileName;
                oFileInfo = new FileInfo(strFilename);
                strFtpURI = Constants.FtpUri;
                strFtpUserId = Constants.FtpUserID;
                strFtpPassword = Constants.FtpPassword;

                oFtpWebRequest = (FtpWebRequest)FtpWebRequest.Create(new Uri(strFtpURI + "/" + strFolderName + "/" + oFileInfo.Name));

                oFtpWebRequest.Credentials = new NetworkCredential(strFtpUserId, strFtpPassword);
                oFtpWebRequest.Proxy = null;
                oFtpWebRequest.KeepAlive = false;
                oFtpWebRequest.Method = WebRequestMethods.Ftp.UploadFile;
                oFtpWebRequest.UseBinary = true;
                oFtpWebRequest.ContentLength = oFileInfo.Length;

                int iBufferLength = 2084;

                buffer = new byte[iBufferLength];

                int iContentLength = 0;

                oFileStream = oFileInfo.OpenRead();

                try
                {
                    iContentLength = oFileStream.Read(buffer, 0, iBufferLength);

                    using (Stream oStream = oFtpWebRequest.GetRequestStream())
                    {
                        while (iContentLength != 0)
                        {
                            oStream.Write(buffer, 0, iContentLength);

                            iContentLength = oFileStream.Read(buffer, 0, iBufferLength);
                        }
                        isUploaded = true;
                        FtpUpload.TotalKBFilesUploaded =  FtpUpload.TotalKBFilesUploaded + (int)(oFileInfo.Length / 1000);
                    }
                }
                catch (Exception ex)
                {

                }
                finally
                {
                    if (oFtpWebRequest != null)
                    {
                        oFtpWebRequest.Abort();
                        oFtpWebRequest = null;
                    }

                    if (buffer != null)
                    {
                        buffer = null;
                    }

                    if (oFileStream != null)
                    {
                        oFileStream.Close();
                        oFileStream.Dispose();
                    }
                }
            }
            catch (Exception ex)
            {
            }
            finally
            {
                oFileInfo = null;
            }

            return isUploaded;
        }

Это загрузка 1000 изображений на FTP, и этот метод вызывается многопоточным способом.

Различные ошибки:

============================================== ========

Сообщение: время ожидания операции истекло

Трассировка ошибки: в System.Net.FtpWebRequest.CheckError() в System.Net.FtpWebRequest.GetRequestStream()

============================================== ========

Сообщение об ошибке: Невозможно подключиться к удаленному серверу

Трассировка ошибки: в System.Net.FtpWebRequest.CheckError() в System.Net.FtpWebRequest.GetRequestStream()

============================================== ========

Сообщение об ошибке: базовое соединение было закрыто: при получении произошла непредвиденная ошибка.

Трассировка ошибки: в System.Net.FtpWebRequest.CheckError() в System.Net.FtpWebRequest.SyncRequestCallback(Object obj) в System.Net.CommandStream.Abort(Exception e) в System.Net.FtpWebRequest.FinishRequestStage(этап RequestStage) в Система.Net.FtpWebRequest.GetRequestStream()

============================================== ========

Сообщение об ошибке: Невозможно записать данные в транспортное соединение: попытка подключения не удалась, поскольку подключенная сторона не ответила должным образом через определенный период времени, или установленное соединение не удалось, поскольку подключенный узел не ответил.

Трассировка ошибки: в System.Net.Sockets.NetworkStream.Write(Byte[] буфер, смещение Int32, размер Int32) в System.Net.FtpDataStream.Write(Byte[] буфер, смещение Int32, размер Int32) == ================================================== ===

Это несколько ошибок, исходящих от того же метода, который я извлек из файла журнала.

Любая идея, что может быть причиной этого? ИЛИ мне нужно дать более подробную информацию?


person James    schedule 08.10.2013    source источник
comment
Похоже, вам нужно поговорить со своими н/з парнями в вашей организации. Я вижу, что все ошибки либо n/w connectivity issues, либо server not responding правильно!   -  person SridharVenkat    schedule 13.01.2014


Ответы (1)


При достижении тайм-аута возникает следующее исключение:

Сообщение об ошибке: базовое соединение было закрыто: при получении произошла непредвиденная ошибка.

Как поясняется в документации msdn, значение времени ожидания по умолчанию равно бесконечности, но документация msdn содержит ошибку: http://msdn.microsoft.com/fr-fr/library/vstudio/system.net.ftpwebrequest.timeout(v=vs.80).aspx

На самом деле значение по умолчанию равно 100000 мс (1 мин 40 с), поэтому вы можете объявить значение Timeout бесконечным с помощью: oFtpWebRequest.Timeout = -1;

http://www.sidesofmarch.com/index.php/archive/2012/04/06/damn-the-documentation-ftpwebrequest-timeout-default-value-is-not-infinite/

person grac    schedule 28.11.2013