cilerler
cilerler

Reputation: 9420

"The remote server returned an error: (501) Syntax error in parameters or arguments." when uploading TO FTP FROM Windows Azure

I need to continuously upload a generated file from Azure to client's FTP but when I run the code below it gives me ...

The remote server returned an error: (501) Syntax error in parameters or arguments.

...also in Azure emulator it works fine.

This is a proof of concept purposes draft code, so I did not use Worker role, queue or blob etc. intentionally...

using System;
using System.IO;
using System.Net;
using System.Web;

namespace CloudWeb
{
    /// <summary>
    /// Summary description for Ftp
    /// </summary>
    public class Ftp : IHttpHandler
    {
        private const string FtpHost = "ftp://ftp.Host.com/App_Data/{0}";
        private const string FtpUserName = "UserName";
        private const string FtpPassword = "Password";
        private const string WarningImageFile = "images/status_warning.png";

        public void ProcessRequest(HttpContext context)
        {
            context.Response.ContentType = "text/plain";
            UploadFtp(context.Server.MapPath(WarningImageFile));
            context.Response.Write("Hello World");
        }

        public bool IsReusable
        {
            get
            {
                return false;
            }
        }

        private static void UploadFtp(string source)
        {
            // read local file
            byte[] bFile = File.ReadAllBytes(source);

            // set ftp values
            var myFtp = (FtpWebRequest)WebRequest.Create(String.Format(FtpHost, Path.GetFileName(source)));
            myFtp.Method = WebRequestMethods.Ftp.UploadFile;
            myFtp.UsePassive = false;
            myFtp.UseBinary = true;
            myFtp.KeepAlive = true;
            myFtp.Credentials = new NetworkCredential(FtpUserName, FtpPassword);

            // upload file
            using (Stream clsStream = myFtp.GetRequestStream())
            {
                clsStream.Write(bFile, 0, bFile.Length);
                clsStream.Close();
                //clsStream.Dispose();
            }

            // ReSharper disable RedundantAssignment
            myFtp = null;
            // ReSharper restore RedundantAssignment
        }
    }
}

Upvotes: 5

Views: 25275

Answers (1)

Erick T
Erick T

Reputation: 7449

If you set UsePassive to false, then you need to make sure that the port for the command channel is open (i.e., you need to define endpoints and access rules). Unless there is a good reason to not use passive, you are far better off using passive.

Erick

Upvotes: 7

Related Questions