微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

从 Azure 函数针对 FTP 服务器主动模式运行 C# FTP 客户端 - “500 语法错误,命令无法识别”

如何解决从 Azure 函数针对 FTP 服务器主动模式运行 C# FTP 客户端 - “500 语法错误,命令无法识别”

我正在尝试连接到使用主动模式的远程 FTP 服务器。 我已经使用 .NET Core 3.1 实现了一个简单的 C# FTP 客户端

var filename = _ftpServerUrl + "/" + targetFilePath;
System.Net.FtpWebRequest request = (System.Net.FtpWebRequest)System.Net.WebRequest.Create(filename);
request.Method = WebRequestMethods.Ftp.UploadFile;
request.Proxy = null;
request.Credentials = new NetworkCredential(username,password);
request.KeepAlive = false;
request.UsePassive = false;
request.UseBinary = true;       
byte[] fileContents;
using (StreamReader sourceStream = new StreamReader(fileStream))
{
    fileContents = Encoding.UTF8.GetBytes(sourceStream.ReadToEnd());
}
request.ContentLength = fileContents.Length;
using (Stream requestStream = request.GetRequestStream())
{
    requestStream.Write(fileContents,fileContents.Length);
}

这在本地主机上的 VS 2019 中运行时效果很好。 但是当代码在 Azure 中作为 Azure 函数 (v3) 运行时,我从服务器收到此响应:

500 语法错误,命令无法识别

我了解 FTP 活动模式要求客户端将其公共 IP 地址发送到服务器,然后服务器将尝试打开与客户端的传入连接。

Azure Function 沙箱中是否有任何东西可以防止这种情况发生?

我什至尝试过使用具有静态公共 IP 的应用服务计划运行我的 Azure 函数,但没有任何运气。

有没有人使用主动模式从 Azure 应用服务或函数成功连接到 FTP 服务器?

解决方法

FTP 服务器不“使用主动模式”。 FTP 客户端可以选择使用主动模式。但是现在防火墙和 NAT 无处不在,使用主动模式几乎行不通。对于云服务、VM 更是如此,对于 Azure 功能这样的特定虚拟服务更是如此。

FTP 主动模式需要传入连接。 Azure 防火墙和 NAT 阻止了这种情况。我希望运行 Azure 函数的 VM 不会转发/打开任何传入端口。他们为什么要?它违背了 Azure 函数的目的。它们旨在运行短期功能,而不是服务器。主动 FTP 模式在这方面是一个奇怪的野兽。几乎没有任何其他客户端功能需要传入端口。

允许传入连接(如果在 Azure 函数中可能的话)不是编程问题。代码中的任何更改都无济于事。一般来说,你应该使用被动模式。

有关背景知识,请参阅我关于 network configuration needed for the active and passive FTP modes 的文章。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。