Reputation: 9420
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
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