Laurent mortroux Ответов: 3

C# FTP и службы windows


Привет

Я хочу сделать сервис на C#, и мой сервис загрузит файл на FTP

Мой код :
public string[] directoryListSimple(ITEM Line, string directory)
        {
            try
            {
                /* Create an FTP Request */
                ftpRequest = (FtpWebRequest)WebRequest.Create(host + "/" + directory);
                /* Log in to the FTP Server with the User Name and Password Provided */
                ftpRequest.Credentials = new NetworkCredential(user, pass);
                ftpRequest.UseBinary = true;
                ftpRequest.UsePassive = false;
                ftpRequest.KeepAlive = true;
                /* Specify the Type of FTP Request */
                ftpRequest.Method = WebRequestMethods.Ftp.ListDirectory;
                /* Establish Return Communication with the FTP Server */
                ftpResponse = (FtpWebResponse)ftpRequest.GetResponse();
                /* Establish Return Communication with the FTP Server */
                ftpStream = ftpResponse.GetResponseStream();
                /* Get the FTP Server's Response Stream */
                StreamReader ftpReader = new StreamReader(ftpStream);
                /* Store the Raw Response */
                string directoryRaw = null;
                /* Read Each Line of the Response and Append a Pipe to Each Line for Easy Parsing */
                try
                {
                    while (ftpReader.Peek() != -1)
                    {
                        directoryRaw += ftpReader.ReadLine() + "|";
                    }
                }
                catch (Exception ex)
                {
                    Line.ERROR = "TRUE";
                    CL_TRAVAIL.Instance.LOG("ERROR 2 = " + ex.ToString());
                }
                ftpReader.Close();
                ftpStream.Close();
                ftpResponse.Close();
                ftpRequest = null;

                /* Resource Cleanup */
                /* Return the Directory Listing as a string Array by Parsing 'directoryRaw' with the Delimiter you Append (I use | in This Example) */
                try
                {
                    string[] directoryList = directoryRaw.Split("|".ToCharArray());
                    Line.ERROR = "FASLE";
                    return directoryList;
                }
                catch (Exception ex)
                {
                    Line.ERROR = "TRUE";
                    CL_TRAVAIL.Instance.LOG("ERROR 2 = " + ex.ToString());
                }
                /* Return an Empty string Array if an Exception Occurs */
                return new string[] { "" };
            }
            catch (Exception ex)
            {
                Line.ERROR = "TRUE";
                CL_TRAVAIL.Instance.LOG("ERROR 3 = " + ex.ToString());
                return new string[] { "" };
            }

        }


Моя ошибка находится в этой строке : ftpResponse = (FtpWebResponse)ftpRequest.GetResponse();

<pre>
10:40:29 - ERROR 3 = System.Net.WebException: La connexion sous-jacente a été fermée : Une erreur inattendue s'est produite lors de la réception.
   à System.Net.FtpWebRequest.CheckError()
   à System.Net.FtpWebRequest.SyncRequestCallback(Object obj)
   à System.Net.CommandStream.Abort(Exception e)
   à System.Net.CommandStream.CheckContinuePipeline()
   à System.Net.FtpDataStream.System.Net.ICloseEx.CloseEx(CloseExState closeState)
   à System.Net.FtpDataStream.Dispose(Boolean disposing)
   à System.IO.Stream.Close()
   à System.IO.StreamReader.Dispose(Boolean disposing)
   à WindowsService.FTP.directoryListSimple(ITEM Line, String directory)



Что я уже пробовал:

Привет

Я использую свой код в приложении windows form, и он работает, но когда я использую его в своем сервисном приложении, он не работает.

У кого-нибудь есть идея

Спасибо

F-ES Sitecore

Похоже, что есть проблема с подключением к ftp-серверу, это может быть проблема сетевого брандмауэра, это может быть не работает ftp-сервер, это могут быть разрешения. Мы никак не можем объяснить вам, почему сервер, к которому у нас нет доступа, не может подключиться к ftp-серверу, к которому у нас также нет доступа. Я бы начал с попытки подключиться к ftp-серверу с другого сервера с помощью инструментов командной строки и посмотреть, работает ли это по крайней мере.

Member 2521084

что такое учетная запись службы ?

Laurent mortroux

Спасибо
да , я деактивирую свой брандмауэр, но почему он работает в windows form pallication и не работает в сервисном приложении как на одном компьютере.

Но мое приложение работает с моим аккаунтом и сервисом с системным аккаунтом

Member 2521084

что означает "локальная" системная учетная запись?. Попробуйте настроить его под своей учетной записью администратора

Laurent mortroux

я пытаюсь с учетной записью администратора, у меня та же проблема.

12:23:48 - ERROR 3 = System.Net.WebException: La connexion sous-jacente a été fermée : Une erreur inattendue s'est produite lors de la réception.
   à System.Net.FtpWebRequest.CheckError()
   à System.Net.FtpWebRequest.SyncRequestCallback(Object obj)
   à System.Net.CommandStream.Abort(Exception e)
   à System.Net.CommandStream.CheckContinuePipeline()
   à System.Net.FtpDataStream.System.Net.ICloseEx.CloseEx(CloseExState closeState)
   à System.Net.FtpDataStream.Dispose(Boolean disposing)
   à System.IO.Stream.Close()
   à System.IO.StreamReader.Dispose(Boolean disposing)
   à WindowsService.FTP.directoryListSimple(ITEM Line, String directory)

Member 2521084

обычно учетная запись администратора имеет доступ к сети. Чтобы быть уверенным, проверьте его еще раз с помощью сетевой учетной записи. Чтобы быть уверенным, у вас есть правильное имя пользователя и пароль в строке "ftpRequest.Учетные данные = new NetworkCredential(user, pass);"?
хтх

Laurent mortroux

привет
Да я использую этот ftp credentiel whith filezila и это тот же файл config для сервиса и формы заявки1
Спасибо

Laurent mortroux

Я разделяю один и тот же класс между моим проектом чтобы быть Шур у меня есть один и тот же код

3 Ответов

Рейтинг:
2

#realJSOP

Попробуйте установить ftpwebrequest.timeout значение равно -1 (неограниченно). В документах MS говорится, что он установлен на это, но на самом деле он установлен на 100000 (100 секунд).


Рейтинг:
16

Laurent mortroux

Я использую это, и это работа, которую я не понимаю, почему???

public List<string> directoryListSimple(ITEM Line, string directory)
        {

            List<string> directoryList = new List<string>();

            FtpWebRequest request = (FtpWebRequest)WebRequest.Create(host + "/" + directory);
            request.Method = WebRequestMethods.Ftp.ListDirectory;

            // This example assumes the FTP site uses anonymous logon.  
            request.Credentials = new NetworkCredential(user, pass);
            FtpWebResponse response = (FtpWebResponse)request.GetResponse();
            Stream responseStream = response.GetResponseStream();
            StreamReader reader = new StreamReader(responseStream);
            //Console.WriteLine(reader.ReadToEnd());

            while (!reader.EndOfStream)
            {
                directoryList.Add(reader.ReadLine());
            }
            Console.WriteLine("Directory List Complete, status {0}", response.StatusDescription);

            reader.Close();
            responseStream.Close();
            response.Close();
            request = null;
            reader=null;
            responseStream=null;
            response = null;
            
            return directoryList;
        }


Рейтинг:
1

Laurent mortroux

Солюс работает со мной

try
            {

                FtpWebRequest ftpReq = (FtpWebRequest)WebRequest.Create(host + "/" + remoteFile);
                ftpReq.UseBinary = true;
                ftpReq.Method = WebRequestMethods.Ftp.UploadFile;
                ftpReq.Credentials = new NetworkCredential(user, pass);

                byte[] b = File.ReadAllBytes(localFile);

                ftpReq.ContentLength = b.Length;
                using (Stream s = ftpReq.GetRequestStream())
                {
                    s.Write(b, 0, b.Length);
                }

                FtpWebResponse ftpResp = (FtpWebResponse)ftpReq.GetResponse();

                if (ftpResp != null)
                {
                    OUTILS.LOG("MSG FTP= " + ftpResp.StatusDescription.ToString());
                }
            }
            catch (Exception e)
            {
                OUTILS.LOG("ERROR START");
                OUTILS.LOG("MSG = " + e.ToString());
                OUTILS.LOG("ERROR END");
            }