Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 SSIS + FtpWebRequest - не работает в Agent Job  [new]
PavM
Member

Откуда:
Сообщений: 122
Всем доброго времени суток.
Как часть пакета ставиться задача: на заданном сервере ftp нужно пройтись по всем папкам и выбрать только те, в которых есть файлы

Было решено сделать это спомощью скрипт таски:
+
      public void Main()
        {
             //TODO: Add your code here
            string ftp = @"ftp://"+ Dts.Variables["User::ftp"].Value.ToString() + @"/";
            string remoteRootFolder = Dts.Variables["User::remoteRootFolder"].Value.ToString();
            string remoteDir = Dts.Variables["User::remoteSourceFolder"].Value.ToString();
            string ftpUserID = Dts.Variables["User::ftpUserID"].Value.ToString();
            string ftpPassword = Dts.Variables["User::ftpPassword"].Value.ToString();
            string logFolder = Dts.Variables["User::LogFolderName"].Value.ToString();
            try
            {
                FtpWebRequest reqFTP;
                reqFTP = (FtpWebRequest)FtpWebRequest.Create(new Uri(ftp + remoteRootFolder));
                reqFTP.UseBinary = true;
                reqFTP.Credentials = new NetworkCredential(ftpUserID, ftpPassword);
                reqFTP.Method = WebRequestMethods.Ftp.ListDirectory;

                reqFTP.Proxy = null;
                reqFTP.KeepAlive = false;
                reqFTP.UsePassive = false;

            List<string> directoryList = new List<string>();
            string curDir = "";
            using (var response = (FtpWebResponse)reqFTP.GetResponse())
            {
                using (var responseStream = response.GetResponseStream())
                {
                    if (responseStream != null)
                    {
                        using (var reader = new StreamReader(responseStream))
                        {
                            while (!reader.EndOfStream)
                            {
                                curDir = reader.ReadLine();
                                if (!IsEmptyFolder(ftp + remoteRootFolder + curDir + @"/" + remoteDir, ftpUserID, ftpPassword))
                                {
                                    directoryList.Add(curDir);
                                }
                            }
                        }
                    }
                }
            }

                Dts.Variables["User::folderList"].Value = (object)directoryList;
            Console.WriteLine("Directory List Complete");
            Dts.TaskResult = (int)ScriptResults.Success;
            }


            catch (Exception e)
            {
                Dts.TaskResult = (int)ScriptResults.Failure;
            }





        }

        public static bool IsEmptyFolder(string path, string ftpUserID, string ftpPassword)
        {
            FtpWebRequest reqFTP1 = (FtpWebRequest)FtpWebRequest.Create(new Uri(path));

            reqFTP1.UseBinary = true;
            reqFTP1.Credentials = new NetworkCredential(ftpUserID, ftpPassword);
            reqFTP1.Method = WebRequestMethods.Ftp.ListDirectoryDetails;
            reqFTP1.Proxy = null;
            reqFTP1.KeepAlive = false;
            reqFTP1.UsePassive = false;

            using (var response1 = (FtpWebResponse)reqFTP1.GetResponse())
            {
                using (var responseStream1 = response1.GetResponseStream())
                {
                    if (responseStream1 != null)
                    {
                        using (var reader1 = new StreamReader(responseStream1))
                        {
                            while (!reader1.EndOfStream)
                            {
                                string resp = reader1.ReadLine();
                                if (resp == "total 0")
                                {
                                    return true;
                                }
                                return false;
                            }
                        }
                    }
                }
            }

            return true;
        }
    }


Результаты пишутся в переменную типа объет, потом ForEach по объекту и все работает как швейцарские часы, если вызывать из BIDS или Package Storage.

Но из SQL Agent данный пакет падает на этой таске. Причем было опытным путем установлено, что если не вызывать метод IsEmptyFolder, а например сделать всегда неверным условие:
                                if (false)
                                {
                                    directoryList.Add(curDir);
                                }
а сам метод закоммитать - то пакет отрабатывает прекрасно.

Множество советов, которые смог найти в инете перепробовал ниодно не помогло.
Прошу помощи - может кто подскажет ключ к решению загадки?
16 авг 11, 15:32    [11127157]     Ответить | Цитировать Сообщить модератору
 Re: SSIS + FtpWebRequest - не работает в Agent Job  [new]
Glory
Member

Откуда:
Сообщений: 104751
PavM
Прошу помощи - может кто подскажет ключ к решению загадки?

Может ключ в сообщении об ошибке, которое вы скрыли ?
16 авг 11, 15:58    [11127453]     Ответить | Цитировать Сообщить модератору
 Re: SSIS + FtpWebRequest - не работает в Agent Job  [new]
PavM
Member

Откуда:
Сообщений: 122
Ошибку выдает вот такую:
System.Net.WebException: The operation has timed out. at System.Net.FtpWebRequest.SyncRequestCallback(Object obj) at System.Net.FtpWebRequest.RequestCallback(Object obj) at System.Net.CommandStream.InvokeRequestCallback(Object obj) at System.Net.CommandStream.Abort(Exception e) at System.Net.FtpWebRequest.FinishRequestStage(RequestStage stage) at System.Net.FtpWebRequest.GetResponse() at ST_0781bd7a0dfe4187bb4cd421ac0038f7.csproj.ScriptMain.Main()[/spoiler]

При выставлении
reqFTP.Timeout = System.Threading.Timeout.Infinite;

процесс не завершается.
16 авг 11, 16:07    [11127547]     Ответить | Цитировать Сообщить модератору
 Re: SSIS + FtpWebRequest - не работает в Agent Job  [new]
Glory
Member

Откуда:
Сообщений: 104751
PavM
процесс не завершается.

Наверное потому, что ftp сервер не возвращает ничего в ответ на запрос ?
16 авг 11, 16:16    [11127631]     Ответить | Цитировать Сообщить модератору
 Re: SSIS + FtpWebRequest - не работает в Agent Job  [new]
PavM
Member

Откуда:
Сообщений: 122
проблема решается отключением firewall, но естественно оставить его так я не могу

проверил: 21 порт открыт
16 авг 11, 16:41    [11127819]     Ответить | Цитировать Сообщить модератору
 Re: SSIS + FtpWebRequest - не работает в Agent Job  [new]
Glory
Member

Откуда:
Сообщений: 104751
PavM
проблема решается отключением firewall, но естественно оставить его так я не могу

проверил: 21 порт открыт

Наверное надо еще чтото отрыть, раз отключение всего firewall помогает ?
16 авг 11, 16:43    [11127838]     Ответить | Цитировать Сообщить модератору
 Re: SSIS + FtpWebRequest - не работает в Agent Job  [new]
PavM
Member

Откуда:
Сообщений: 122
знать бы еще что - с удовольствием бы сделал :)
16 авг 11, 16:47    [11127870]     Ответить | Цитировать Сообщить модератору
 Re: SSIS + FtpWebRequest - не работает в Agent Job  [new]
Glory
Member

Откуда:
Сообщений: 104751
PavM
знать бы еще что - с удовольствием бы сделал :)

Посмотреть лог firewall-а никак что ли ?
16 авг 11, 16:49    [11127884]     Ответить | Цитировать Сообщить модератору
 Re: SSIS + FtpWebRequest - не работает в Agent Job  [new]
PavM
Member

Откуда:
Сообщений: 122
#Fields:
datetimeactionprotocolsrc-ipdst-ipsrc-portdst-portsizetcpflagstcpsyntcpacktcpwinicmptypeicmpcodeinfopath
2011-08-1616:53:14DROPTCP198.80.191.1310.143.13.164205302444S255278080808760---RECEIVE
2011-08-1616:53:17DROPTCP198.80.191.1310.143.13.164205302444S255278080808760---RECEIVE
2011-08-1616:53:24DROPTCP198.80.191.1310.143.13.164205302444S255278080808760---RECEIVE


Добавление 20 порта в рули не помогло

Сообщение было отредактировано: 16 авг 11, 17:13
16 авг 11, 17:08    [11128059]     Ответить | Цитировать Сообщить модератору
 Re: SSIS + FtpWebRequest - не работает в Agent Job  [new]
Уленшпигель
Member

Откуда:
Сообщений: 115
PavM,

reqFTP1.UsePassive = true

пробовали?
16 авг 11, 17:14    [11128098]     Ответить | Цитировать Сообщить модератору
 Re: SSIS + FtpWebRequest - не работает в Agent Job  [new]
Уленшпигель
Member

Откуда:
Сообщений: 115
PavM
#Fields:
datetimeactionprotocolsrc-ipdst-ipsrc-portdst-portsizetcpflagstcpsyntcpacktcpwinicmptypeicmpcodeinfopath
2011-08-1616:53:14DROPTCP198.80.191.1310.143.13.164205302444S255278080808760---RECEIVE
2011-08-1616:53:17DROPTCP198.80.191.1310.143.13.164205302444S255278080808760---RECEIVE
2011-08-1616:53:24DROPTCP198.80.191.1310.143.13.164205302444S255278080808760---RECEIVE


Добавление 20 порта в рули не помогло


это лог с сервера или с клиента?
16 авг 11, 17:15    [11128112]     Ответить | Цитировать Сообщить модератору
 Re: SSIS + FtpWebRequest - не работает в Agent Job  [new]
PavM
Member

Откуда:
Сообщений: 122
Уленшпигель,

198.80.191.13 - IP сервера
10.143.13.164 - мой

лог с клиента.
16 авг 11, 17:17    [11128128]     Ответить | Цитировать Сообщить модератору
 Re: SSIS + FtpWebRequest - не работает в Agent Job  [new]
Уленшпигель
Member

Откуда:
Сообщений: 115
PavM,

ну так там написано, что файерволл не одобряет входящего соединения на порт 53024. Добавлять его в правила бесполезно, потому что он будет каждый раз разный. Попоробуйте таки
reqFTP1.UsePassive = true
16 авг 11, 17:22    [11128165]     Ответить | Цитировать Сообщить модератору
 Re: SSIS + FtpWebRequest - не работает в Agent Job  [new]
PavM
Member

Откуда:
Сообщений: 122
Уленшпигель,

спасибо

это помогло и данная script task не падает..
но падает теперь старнадтная ftp task, которая закачивает файлы с ftp

в логе firewall - теже самые строки
16 авг 11, 17:38    [11128334]     Ответить | Цитировать Сообщить модератору
 Re: SSIS + FtpWebRequest - не работает в Agent Job  [new]
Уленшпигель
Member

Откуда:
Сообщений: 115
PavM
Уленшпигель,

спасибо

это помогло и данная script task не падает..
но падает теперь старнадтная ftp task, которая закачивает файлы с ftp

в логе firewall - теже самые строки


а раньше не падала?
16 авг 11, 18:01    [11128593]     Ответить | Цитировать Сообщить модератору
 Re: SSIS + FtpWebRequest - не работает в Agent Job  [new]
PavM
Member

Откуда:
Сообщений: 122
Уленшпигель,

раньше в этом пакете он до туда не доходил (если запускать через агента). Но в других пакетах, которые работают с тем же сервером с теме же настройками все работает.


Task 'Copy files from ftp to working folder' failed. (An error occurred with the following error message: "An error occurred in the requested FTP operation. Detailed error description: The operation timed out . ". )
16 авг 11, 18:13    [11128699]     Ответить | Цитировать Сообщить модератору
 Re: SSIS + FtpWebRequest - не работает в Agent Job  [new]
PavM
Member

Откуда:
Сообщений: 122
все работает в BIDS и не работает в SQL Agent, при включенном firewall :(
16 авг 11, 18:54    [11128905]     Ответить | Цитировать Сообщить модератору
 Re: SSIS + FtpWebRequest - не работает в Agent Job  [new]
Уленшпигель
Member

Откуда:
Сообщений: 115
PavM,

ну так причина та же - фаервол не принимает входящих соединений на произвольные порты. Надо или перевести фтп-клиент в пассивный режим или, в крайнем случае, разрешить фаерволу пропускать входящие подключения с порта 20 фтп сервера на любой локальный порт > 1024. Других вариантов мне не видится.
16 авг 11, 19:00    [11128930]     Ответить | Цитировать Сообщить модератору
 Re: SSIS + FtpWebRequest - не работает в Agent Job  [new]
PavM
Member

Откуда:
Сообщений: 122
Уленшпигель,

спасибо

попробую все ftp task переделать на script task, использующих UsePassive = true

надеюсь, что получиться.
16 авг 11, 19:12    [11128966]     Ответить | Цитировать Сообщить модератору
 Re: SSIS + FtpWebRequest - не работает в Agent Job  [new]
PavM
Member

Откуда:
Сообщений: 122
вот я олень :)
чуть не придумал себе лишнюю проблему.

все решилось намного проще:
в параметрах ftp connection manager выставил UsePassiveMode = true

Уленшпигель, огромное спасибо за помощь.
16 авг 11, 19:21    [11128990]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить