使用 FTP 从 Azure WebJobs 发送文件

Send File From Azure WebJobs Using FTP

当我尝试使用 FTP 从 Azure WebJobs 发送文件时,我遇到了 1 个问题。 这交替抛出 'The remote server returned an error: (530) Not logged in.',我的代码在本地主机(在开发计算机上)中运行良好。

我已经阅读了所有这些 Post 但我没有找到方法:

FTPWebRequest 530 Error: Not Logged in issue

FTP The remote server returned an error: (530) Not logged in

Ftp to external server in azure webjob not working

其他,但我的应用程序服务中只有 1 个网络作业,当作业 运行ning 时 CPU 为 30% ..

编辑: 代码制作目录

FtpWebRequest reqFTP = null;
        Stream ftpStream = null;

        string[] subDirs = directory.Split('/');

        string currentDir = publishUrl;

        foreach (string subDir in subDirs)
        {
            try
            {
                currentDir = currentDir + "/" + subDir;
                reqFTP = (FtpWebRequest)FtpWebRequest.Create(currentDir);
                reqFTP.Method = WebRequestMethods.Ftp.MakeDirectory;
                reqFTP.UseBinary = true;
                //reqFTP.UsePassive = true;
                //reqFTP.KeepAlive = true;
                reqFTP.Credentials = new NetworkCredential(userName, userPWD);
                FtpWebResponse response =  (FtpWebResponse)await reqFTP.GetResponseAsync();
                ftpStream = response.GetResponseStream();
                ftpStream.Close();
                response.Close();
            }
            catch (Exception exception)
            {

                Console.WriteLine(exception.Message);
                //directory already exist I know that is weak but there is no way to check if a folder exist on ftp...
            }
        }

代码发送文件:

        try
        {
            using (WebClient client = new WebClient())
            {
                client.Credentials = new NetworkCredential(userName, userPWD);
                client.UploadFile(publishUrl, "STOR", localFileName);
                return true;
            }
        }
        catch (Exception exception)
        {
            //Console.Error.Write(exception.Message);
            Console.WriteLine(exception.Message);
            return false;
        }

当我在 Azure WebApp WebJobs 中编写 运行 代码时记录(失败): https://pastebin.com/vgTxqT5p

并在我 运行 代码在本地机器上记录(效果很好): https://pastebin.com/hBpum8T0

我认为解决方法是在 WebJobs 应用程序样式上,正常功能不等待。我将更改我的代码以对我的所有 WebJobs 程序使用 Async Await 方法。

有什么办法吗? 提前致谢。

糟糕的方式(我不喜欢这个)但它的工作......:

像这样更改创建目录功能:

public static void MakeFTPDir(string publishUrl, string userName, string userPWD, string directory)
    {
        FtpWebRequest reqFTP = null;
        Stream ftpStream = null;

        string[] subDirs = directory.Split('/');

        string currentDir = publishUrl;

        foreach (string subDir in subDirs)
        {
            bool isNotCreated = true;
            int iTentative = 0;
            currentDir = currentDir + "/" + subDir;
            while (isNotCreated)
            {
                iTentative++;
                try
                {
                    reqFTP = (FtpWebRequest)FtpWebRequest.Create(currentDir);
                    reqFTP.Method = WebRequestMethods.Ftp.MakeDirectory;
                    reqFTP.UseBinary = true;
                    reqFTP.UsePassive = true;
                    reqFTP.KeepAlive = true;
                    reqFTP.Credentials = new NetworkCredential(userName, userPWD);
                    FtpWebResponse response = (FtpWebResponse)reqFTP.GetResponse();
                    ftpStream = response.GetResponseStream();
                    ftpStream.Close();
                    response.Close();
                }
                catch(WebException webException)
                {
                    FtpWebResponse excWebResponse = (FtpWebResponse)webException.Response;
                    if(excWebResponse.StatusCode == FtpStatusCode.NotLoggedIn)
                    {
                        Console.WriteLine("WebException ==> NotLoggedIn >> Tentative :" + iTentative);
                        isNotCreated = true;
                    }
                    else
                    {
                        Console.WriteLine(webException.Message);
                        isNotCreated = false;
                    }
                }
                catch (Exception exception)
                {
                    FtpWebResponse response = (FtpWebResponse)reqFTP.GetResponse();
                    if (response.StatusCode == FtpStatusCode.NotLoggedIn)
                    {
                        Console.WriteLine("Exception ==> NotLoggedIn >> Tentative :" + iTentative);
                        isNotCreated = true;
                    }
                    else
                    {
                        Console.WriteLine(exception.Message);
                        isNotCreated = false;
                    }
                }
            }
        }
    }

像这样更改发送文件功能

 public static bool SendFtpFile(string publishUrl, string userName, string userPWD, string localFileName)
    {
        bool isNotCreated = true;
        int iTentative = 0;
        while (isNotCreated)
        {
            iTentative++;
            try
            {
                using (WebClient client = new WebClient())
                {
                    client.Credentials = new NetworkCredential(userName, userPWD);
                    client.UploadFile(publishUrl, "STOR", localFileName);
                    return true;
                }
            }
            catch (WebException webException)
            {
                FtpWebResponse excWebResponse = (FtpWebResponse)webException.Response;
                if (excWebResponse.StatusCode == FtpStatusCode.NotLoggedIn)
                {
                    Console.WriteLine("WebException ==> NotLoggedIn >> Tentative :" + iTentative);
                    isNotCreated = true;
                }
                else
                {
                    Console.WriteLine(webException.Message);
                    return false;
                }
            }
            catch (Exception exception)
            {
                Console.WriteLine(exception.Message);
                return false;
            }
        }
        return true;
    }

更改 IfFileExistOnServer :

public static bool CheckIfFileExistsOnServer(string publishUrl, string userName, string userPWD, string fileName)
    {
        bool isNoCheck = true;
        int iTentative = 0;
        string azureBotUrl = publishUrl + "/" + fileName;

        while (isNoCheck)
        {
            iTentative++;
            try
            {
                var request = (FtpWebRequest)WebRequest.Create(azureBotUrl);
                request.Credentials = new NetworkCredential(userName, userPWD);
                request.UseBinary = true;
                request.UsePassive = true;
                request.KeepAlive = true;
                request.Method = WebRequestMethods.Ftp.GetFileSize;
                FtpWebResponse response = (FtpWebResponse)request.GetResponse();
                return true;
            }
            catch (WebException webException)
            {
                FtpWebResponse excWebResponse = (FtpWebResponse)webException.Response;
                if (excWebResponse.StatusCode == FtpStatusCode.ActionNotTakenFileUnavailable)
                    return false;
                if (excWebResponse.StatusCode == FtpStatusCode.NotLoggedIn)
                {
                    Console.WriteLine("WebException ==> NotLoggedIn >> Tentative :" + iTentative);
                    isNoCheck = true;
                }
                else
                {
                    return false;
                }
            }
        }
        return false;
    }

并更改 RenameFileOnServer :

public static bool RenameFileOnServer(string publishUrl, string userName, string userPWD, string sourceFileName, string newFileName)
    {
        bool isNoRenameFile = true;
        int iTentative = 0;
        FtpWebRequest ftpRequest = null;
        FtpWebResponse ftpResponse = null;
        string azureBotUrl = publishUrl + "/" + sourceFileName;
        while (isNoRenameFile)
        {
            iTentative++;
            try
            {
                ftpRequest = (FtpWebRequest)WebRequest.Create(azureBotUrl);
                ftpRequest.Credentials = new NetworkCredential(userName, userPWD);
                ftpRequest.UseBinary = true;
                ftpRequest.UsePassive = true;
                ftpRequest.KeepAlive = true;
                ftpRequest.Method = WebRequestMethods.Ftp.Rename;
                ftpRequest.RenameTo = newFileName.Split('\')[newFileName.Split('\').Length - 1];
                ftpResponse = (FtpWebResponse)ftpRequest.GetResponse();
                ftpResponse.Close();
                ftpRequest = null;
                return true;
            }
            catch (WebException webException)
            {
                FtpWebResponse excWebResponse = (FtpWebResponse)webException.Response;
                if (excWebResponse.StatusCode == FtpStatusCode.NotLoggedIn)
                {
                    Console.WriteLine("WebException ==> NotLoggedIn >> Tentative :" + iTentative);
                    isNoRenameFile = true;
                }
                else
                {
                    return false;
                }
                Console.WriteLine(webException.Message);
            }
            catch (Exception)
            {
                return false;
            }
        }
        return false;
    }

我正在等待 Azure 支持女士打来的电话...