【问题标题】:WebClient.UploadData return byte[0] for FTPWebClient.UploadData 为 FTP 返回字节 [0]
【发布时间】:2015-07-21 09:31:27
【问题描述】:

我使用以下代码示例将数据上传到 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]

【问题讨论】:

    标签: c# ftp webclient


    【解决方案1】:

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

    您希望得到什么样的回应? FTP 服务器返回的只是一条状态消息。如果返回成功,WebClient.UploadData 会静默返回。如果它作为错误返回,WebClient.UploadData 会抛出异常并显示状态消息。

    例如:

    “System.Net.WebException”类型的未处理异常发生在 系统.dll

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

    【讨论】:

      【解决方案2】:

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

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

      看起来它正在使用另一个端口(默认 20)来发送响应,这就是您无法收到它的原因。

      您没有提到 client 对象是什么类型,但我建议使用内置的 FTPWebRequest 类来执行 FTP 操作。这是一个如何使用它上传文件的示例:MSDN How to: Upload Files with FTP

      更新:

      我测试了上面文章中的示例代码,可以通过 FtpWebResponse.StatusDescription 等获取到服务器的响应消息

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

      这正是 OP 想要的

      【讨论】:

      • WebClient 在内部使用FTPWebRequest。它自然会处理数据连接端口,否则就没用了。
      • 它不会没用,因为它还有其他用途,显然FTP只是一种协议。您如何认为它在内部使用 FtpWebRequest?我检查了源代码,没有提到 FtpWebRequest。在文档中它只是说“此方法使用 STOR 命令上传 FTP 资源。对于 HTTP 资源,使用 POST 方法”
      • 当然,它也支持其他协议。但它支持FTP,这就是重点。而且不支持数据连接的FTP支持是没用的。
      • 你能指出它在内部使用 FtpWebRequest 的地方吗?我还是没找到。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-05-30
      • 2012-04-15
      • 1970-01-01
      • 1970-01-01
      • 2018-08-21
      相关资源
      最近更新 更多