首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >C# .NET可以将文件上传到运行纯ftpd的FTPS服务器上吗?

C# .NET可以将文件上传到运行纯ftpd的FTPS服务器上吗?
EN

Stack Overflow用户
提问于 2022-01-07 00:18:03
回答 1查看 301关注 0票数 1

当试图通过.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)可以将文件(使用相同的凭据,从相同的网络/机器上传到同一台服务器)而不会出现问题。

我看到的其他类似问题建议更改请求的各种属性(EnableSslUseBinaryUsePassiveKeepAliveTimeout)。我尝试过这些属性的各种组合,但都没有效果。

我不知道是什么问题。我倾向于认为这是客户端的错误配置,因为其他语言/客户端连接到服务器时没有问题。我不称自己为C#/.NET开发人员,因此可能有明显的遗漏--任何帮助都是值得感谢的。

代码语言:javascript
复制
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...");

客户端输出:

代码语言:javascript
复制
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行

服务器输出:

代码语言:javascript
复制
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
EN

回答 1

Stack Overflow用户

发布于 2022-01-07 17:56:24

虽然我不能绝对确切地找出这个问题的原因,但它似乎是在2019年至2010年前后的.NET更新是元凶。将pureftpd更新为更新版本(至少1.0.49-r2)似乎会使pureftpd在更新的.NET版本中发挥得更好。

感谢@Martin Prikryl的链接问题(特别是答案中的参考)。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/70615175

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档