当试图通过.NET将文件上载到运行纯-ftpd(配置为FTPS而不是SFTP,需要在TLS上显式ftp )的FTP服务器时,会引发异常:
Unhandled exception. System.Net.WebException: The underlying connection was closed: The server committed a protocol violation.
服务器日志似乎表明一切进展顺利,直到客户端在150 Accepted data connection日志消息之后停止通信。
客户端日志表示字节被写入流,但关闭流似乎会触发异常。
在ftp服务器上创建一个文件;但是,不向它写入任何内容。
其他客户端(即Filezilla)可以将文件(使用相同的凭据,从相同的网络/机器上传到同一台服务器)而不会出现问题。
我看到的其他类似问题建议更改请求的各种属性(EnableSsl、UseBinary、UsePassive、KeepAlive、Timeout)。我尝试过这些属性的各种组合,但都没有效果。
我不知道是什么问题。我倾向于认为这是客户端的错误配置,因为其他语言/客户端连接到服务器时没有问题。我不称自己为C#/.NET开发人员,因此可能有明显的遗漏--任何帮助都是值得感谢的。
using System;
using System.IO;
using System.Net;
using System.Text;
Uri target = new Uri("ftp://ftp.example.com:21/filenamehere");
FtpWebRequest request = (FtpWebRequest)WebRequest.Create(target);
request.Method = WebRequestMethods.Ftp.UploadFile;
request.EnableSsl = true;
request.Credentials = new NetworkCredential("myusername", "password");
request.UseBinary = true;
request.UsePassive = true;
request.KeepAlive = true;
request.Timeout = -1;
Stream fileStream = File.OpenRead(@"testfile.txt");
Stream ftpStream = request.GetRequestStream();
byte[] buffer = new byte[10240];
int read;
while ((read = fileStream.Read(buffer, 0, buffer.Length)) > 0)
{
ftpStream.Write(buffer, 0, read);
Console.WriteLine("Uploaded {0} bytes", fileStream.Position);
}
ftpStream.Close();
Console.WriteLine("done...");客户端输出:
Uploaded 10240 bytes
Uploaded 20480 bytes
Uploaded 30720 bytes
Uploaded 40960 bytes
Uploaded 51200 bytes
Uploaded 61440 bytes
Uploaded 71680 bytes
Uploaded 81920 bytes
Uploaded 92160 bytes
Uploaded 92295 bytes未处理异常。基础连接被关闭:服务器在System.Net.FtpWebRequest.SyncRequestCallback(Object obj( System.Net.CommandStream.InvokeRequestCallback(Object obj)、在System.Net.CommandStream.Abort( System.Net.CommandStream.CheckContinuePipeline() at System.Net.FtpWebRequest.DataStreamClosed(CloseExState closeState)、在System.Net.FtpDataStream.System.Net.ICloseEx.CloseEx(CloseExState closeState(System.Net.FtpDataStream.System.Net.ICloseEx.CloseEx(CloseExState closeState)、System.Net.FtpDataStream.Dispose(布尔处理)、System.IO.Stream.Close() at Program.$(String[] args)在/user/user/MyApp/Program.cs中:第27行
服务器输出:
Jan 6 23:46:06 machine1 ftp.debug pure-ftpd: (?@XX.XX.XX.XX) [DEBUG] Command [user] [myusername]
Jan 6 23:46:06 machine1 ftp.debug pure-ftpd: (?@XX.XX.XX.XX) [DEBUG] 331 User myusername OK. Password required
Jan 6 23:46:06 machine1 ftp.info pure-ftpd: (?@XX.XX.XX.XX) [INFO] myusername is now logged in
Jan 6 23:46:06 machine1 ftp.debug pure-ftpd: (myusername@XX.XX.XX.XX) [DEBUG] 230 OK. Current restricted directory is /
Jan 6 23:46:06 machine1 ftp.debug pure-ftpd: (myusername@XX.XX.XX.XX) [DEBUG] Command [pbsz] [0]
Jan 6 23:46:06 machine1 ftp.debug pure-ftpd: (myusername@XX.XX.XX.XX) [DEBUG] 200 PBSZ=0
Jan 6 23:46:06 machine1 ftp.debug pure-ftpd: (myusername@XX.XX.XX.XX) [DEBUG] Command [prot] [P]
Jan 6 23:46:06 machine1 ftp.debug pure-ftpd: (myusername@XX.XX.XX.XX) [DEBUG] 200 Data protection level set to "private"
Jan 6 23:46:06 machine1 ftp.debug pure-ftpd: (myusername@XX.XX.XX.XX) [DEBUG] Command [opts] [utf8 on]
Jan 6 23:46:06 machine1 ftp.debug pure-ftpd: (myusername@XX.XX.XX.XX) [DEBUG] 500 Unknown command
Jan 6 23:46:06 machine1 ftp.debug pure-ftpd: (myusername@XX.XX.XX.XX) [DEBUG] Command [pwd] []
Jan 6 23:46:06 machine1 ftp.debug pure-ftpd: (myusername@XX.XX.XX.XX) [DEBUG] 257 "/" is your current location
Jan 6 23:46:06 machine1 ftp.debug pure-ftpd: (myusername@XX.XX.XX.XX) [DEBUG] Command [type] [I]
Jan 6 23:46:06 machine1 ftp.debug pure-ftpd: (myusername@XX.XX.XX.XX) [DEBUG] 200 TYPE is now 8-bit binary
Jan 6 23:46:06 machine1 ftp.debug pure-ftpd: (myusername@XX.XX.XX.XX) [DEBUG] Command [pasv] []
Jan 6 23:46:06 machine1 ftp.debug pure-ftpd: (myusername@XX.XX.XX.XX) [DEBUG] 227 Entering Passive Mode (YY,YY,YY,YY,YY,YY)
Jan 6 23:46:07 machine1 ftp.debug pure-ftpd: (myusername@XX.XX.XX.XX) [DEBUG] Command [stor] [filenamehere]
Jan 6 23:46:07 machine1 ftp.debug pure-ftpd: (myusername@XX.XX.XX.XX) [DEBUG] 150 Accepted data connection发布于 2022-01-07 17:56:24
虽然我不能绝对确切地找出这个问题的原因,但它似乎是在2019年至2010年前后的.NET更新是元凶。将pureftpd更新为更新版本(至少1.0.49-r2)似乎会使pureftpd在更新的.NET版本中发挥得更好。
感谢@Martin Prikryl的链接问题(特别是答案中的参考)。
https://stackoverflow.com/questions/70615175
复制相似问题