WebClient.UploadData返回字节[0]为FTP

本文关键字:FTP UploadData 返回 字节 WebClient | 更新日期: 2023-09-27 18:03:40

我使用下面的代码示例将数据上传到FTP服务器。

var streamXml = new MemoryStream();
var writer = new StreamWriter(streamXml);
writer.Write(stringaXml);
writer.Flush();
streamXml.Position = 0;
var response = client.UploadData(remoteFilePath, ReadFully(streamXml));       
Logger.Info(client.Encoding.GetString(response));
public static byte[] ReadFully(Stream input)
{
    var buffer = new byte[16 * 1024];
    using (var ms = new MemoryStream())
    {
         int read;
         while ((read = input.Read(buffer, 0, buffer.Length)) > 0)
         {
             ms.Write(buffer, 0, read);
         }
         return ms.ToArray();
     }
}

文件传输成功,但response始终是byte[0]

我在这里错过了什么吗?

我这样修改了ReadFully方法:

public static byte[] ReadFully(Stream input)
{
    using (MemoryStream ms = new MemoryStream())
    {
        input.CopyTo(ms);
        return ms.ToArray();
    }
}

我的小XML文件成功保存到FTP服务器,但response仍然是byte[0]

WebClient.UploadData返回字节[0]为FTP

FTP上传(与HTTP上传相反)不能有任何响应体。所以WebClient.UploadData永远不会为FTP返回任何东西。

你期望什么样的反应?所有FTP服务器返回的都是状态消息。如果返回成功,则WebClient.UploadData静默返回。如果它作为错误返回,WebClient.UploadData抛出一个带有状态消息的异常。

例如:

System.Net类型的未处理异常。webeexception '发生在System.dll

附加信息:远程服务器返回一个错误:(550)文件不可用(例如,文件未找到,无法访问)。

我检查了FTP (https://www.rfc-editor.org/rfc/rfc959)的RFC,它说

The data, when transferred in response to FTP service commands, shall always be sent over the data connection, except for certain informative replies.

看起来它正在使用另一个端口(默认为20)来发送响应,这就是为什么你不能接收它。

您没有提到客户端对象是什么类型,但我建议使用内置的FTPWebRequest类来执行FTP操作。下面是一个如何使用它来上传文件的示例:MSDN如何:使用FTP上传文件

更新:

我测试了上面文章中的示例代码,并且能够通过FtpWebResponse获得服务器的响应消息。StatusDescription,如

226传输成功"/newFile.txt"'r'n"

这正是OP想要的