Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/294.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# &引用;500语法错误,命令无法识别";在Azure VM上FtpWebRequest处于主动模式(UseAssivative=False)时_C#_.net_Azure_Ftp_Ftpwebrequest - Fatal编程技术网

C# &引用;500语法错误,命令无法识别";在Azure VM上FtpWebRequest处于主动模式(UseAssivative=False)时

C# &引用;500语法错误,命令无法识别";在Azure VM上FtpWebRequest处于主动模式(UseAssivative=False)时,c#,.net,azure,ftp,ftpwebrequest,C#,.net,Azure,Ftp,Ftpwebrequest,我有一个测试C#控制台应用程序,它使用FtpWebRequest将文件传输到公共FTP服务器 应用程序在UseAssive设置为False的情况下从我的开发PC运行。但是,当我将应用程序复制到Azure VM时,会引发以下异常: 远程服务器返回错误:(500)语法错误,命令 未被承认 总之,以下是在本地和Azure上运行应用程序时的结果: 使用被动本地PC Azure VM ---------- -------- -------- 真的好的好的 False ok错误! 为System.N

我有一个测试C#控制台应用程序,它使用
FtpWebRequest
将文件传输到公共FTP服务器

应用程序在UseAssive设置为False的情况下从我的开发PC运行。但是,当我将应用程序复制到Azure VM时,会引发以下异常:

远程服务器返回错误:(500)语法错误,命令 未被承认

总之,以下是在本地和Azure上运行应用程序时的结果:

使用被动本地PC Azure VM
----------  --------   --------
真的好的好的
False ok错误!
System.Net
启用跟踪显示以下内容(摘录):

System.Net信息:0:[5716]FtpControlStream#60068066-已创建从10.0.0.4:49706到90.130.70.73:21的连接。
系统.Net信息:0:[5716]将FTPWebreRequest#45004109与FtpControlStream#60068066关联
系统.Net信息:0:[5716]FtpControlStream#60068066-收到的响应[220(vsFTPd 2.3.5)]
系统.Net信息:0:[5716]FtpControlStream#60068066-发送命令[用户匿名]
System.Net信息:0:[5716]FtpControlStream#60068066-收到响应[331请指定密码。]
系统.Net信息:0:[5716]FtpControlStream#60068066-发送命令[PASS********]
系统.Net信息:0:[5716]FtpControlStream#60068066-收到响应[230登录成功。]
系统.Net信息:0:[5716]FtpControlStream#60068066-发送命令[OPTS utf8 on]
系统.Net信息:0:[5716]FtpControlStream#60068066-收到响应[200始终处于UTF8模式。]
系统.Net信息:0:[5716]FtpControlStream#60068066-发送命令[PWD]
系统.Net信息:0:[5716]FtpControlStream#60068066-收到的响应[257”/“]
系统.Net信息:0:[5716]FtpControlStream#60068066-发送命令[类型I]
系统.Net信息:0:[5716]FtpControlStream#60068066-收到响应[200切换到二进制模式。]
系统.Net信息:0:[5716]FtpControlStream#60068066-发送命令[端口10,0,0,4194,43]
系统.Net信息:0:[5716]FtpControlStream#60068066-收到响应[500非法端口命令。]
系统.Net信息:0:[5716]FtpWebRequest#45004109::(正在释放FTP连接#60068066。)
System.Net错误:0:[5716]FtpWebRequest#45004109::GetRequestStream中出现异常-远程服务器返回错误:(500)语法错误,无法识别命令。。
在System.Net.FtpWebRequest.SyncRequestCallback中(对象obj)
以下是我的应用程序的源代码:

var fileContents = Encoding.UTF8.GetBytes("this is a test");

Console.Write("UsePassive? (y/n)");
var passive = Console.ReadKey();

var usePassive = passive.Key == ConsoleKey.Y;

var request = (FtpWebRequest)WebRequest.Create("ftp://speedtest.tele2.net/upload/mytest.txt");
request.Credentials = new NetworkCredential("anonymous", "anonymous");
request.Method = WebRequestMethods.Ftp.UploadFile;
request.UsePassive = usePassive;
request.ContentLength = fileContents.Length;

using (var requestStream = request.GetRequestStream())
{
    requestStream.WriteAsync(fileContents, 0, fileContents.Length);
}
using (FtpWebResponse response = (FtpWebResponse)request.GetResponse())
{
    Console.WriteLine($"Upload File Complete, status {response.StatusDescription}");
}
Azure VM不是网络安全组的一部分。我已尝试在VM上禁用防火墙,但该应用程序仍会引发异常

我如何解决这个问题?我的应用程序必须将
usesponsive
设置为
False

端口10,0,0,4194,43
500非法端口命令。
10.0.0.4是一个专用IP地址。您不能向FTP服务器发送私有IP地址,因为它无法连接回FTP服务器(因此出现500错误)。你必须使用你的公共IP地址。我不知道如何覆盖
FtpWebRequest
的本地IP地址。检查.NET源代码,在我看来,这甚至是不可能的

正如我已经写给你的:甚至不要尝试使用活动模式。从网络的角度进行设置很复杂。请参阅我的文章

因此,再次使用被动模式。我知道被动模式也有问题。但它们比主动模式的问题更有可能得到解决


如果坚持使用活动模式,请使用支持指定本地IP地址的FTP客户端库

例如:

(我是WinSCP的作者)

您仍然必须为所有数据连接端口打开VM防火墙



虽然我没有测试它,但看起来如果本地机器(VM)只有IPv6 IP地址,
FtpWebRequest
将使用
EPRT
command而不使用IP地址,而不是带有IP地址的
PORT
命令。什么也能解决你的问题。您仍然必须为所有数据连接端口打开VM防火墙。

为什么要使用
useAnsive=False
?-其实这是最有可能的。只是
FtpWebRequest
有一个坏习惯,就是将FTP错误代码“翻译”成自己的解释(通常是误导性的)。在本例中,它将500转换为“语法错误,无法识别命令”,隐藏了可能是“非法端口命令”的原始FTP服务器错误消息。但是,
FTP.exe
仅支持活动模式,因此您没有其他选择。使用
FtpWebRequest
您可以(而且应该)使用被动模式来解决问题。我尝试连接的第三方FTP服务器不支持被动模式。我收到以下错误:远程服务器返回错误:227进入被动模式。(第三方FTP服务器不是示例代码中显示的服务器)如果服务器不支持被动模式,它将永远不会响应“227进入被动模式”-看起来像您这样-而不是使用被动模式(您应该使用)解决问题,您会问一个关于主动模式(您不应该使用)的问题.I刚将useAnsive设置为True&这就是记录的错误。
// Set up session options
SessionOptions sessionOptions = new SessionOptions
{
    Protocol = Protocol.Ftp,
    HostName = "10.0.0.4",
    FtpMode = FtpMode.Active,
};

using (Session session = new Session())
{
    session.AddRawConfiguration(@"Interface\ExternalIpAddress", "your public IP address");

    // Connect
    session.Open(sessionOptions);

    // Upload
    session.PutFiles(@"C:\local\path\file.txt", "/upload/mytest.txt").Check();
}