要点: 我正在使用WebRequest从我自己的互联网DNS下载FTP文件。这是我第一次编写从FTP服务器下载文件的应用程序。我在下载过程中遇到了许多不一致的损坏,导致XML文件无法使用。下载文件的实际代码取自Microsoft Windows 8 Sample,名为:“Windows应用商店应用中的FTP文件下载器”。我发现即使使用此Windows 8示例也会导致相同的损坏,因此在我的代码中不一定是其他内容。
简介 我的Windows应用商店应用程序将XML文件用于其数据。此数据最初来自Excel。我需要每月更新这些数据,并使应用程序的用户可以无缝地使用它。为此,我创建了一个网站,我已经存储了最新版本的XML数据文件。这些文件已经使用Filezilla以二进制传输模式上传(在切线上我发现WebRequest正在从文件中删除所有CR / LF,如果它们以ASCII格式上传,使它们无用)。
我的应用使用Microsoft示例中提供的代码进行Windows应用商店的FTP文件传输。它看起来像这样:
using System;
using System.IO;
using System.Net;
using System.Runtime.InteropServices.WindowsRuntime;
using System.Threading.Tasks;
using Windows.Storage;
using Windows.Storage.Streams;
namespace CSWindowsStoreAppFTPDownloader.FTP
{
public static class FTPClient
{
/// <summary>
/// Download a single file from FTP server using WebRequest.
/// </summary>
public static async Task<DownloadCompletedEventArgs>
DownloadFTPFileAsync(FTPFileSystem item,
StorageFile targetFile, ICredentials credential)
{
var result = new DownloadCompletedEventArgs
{
RequestFile = item.Url,
LocalFile = targetFile,
Error=null
};
// This request is FtpWebRequest in fact.
WebRequest request = WebRequest.Create(item.Url);
if (credential != null)
{
request.Credentials = credential;
}
request.Proxy = WebRequest.DefaultWebProxy;
// Set the method to Download File
request.Method = "RETR";
try
{
// Open the file for write.
using (IRandomAccessStream fileStream =
await targetFile.OpenAsync(FileAccessMode.ReadWrite))
{
// Get response.
using (WebResponse response = await request.GetResponseAsync())
{
// Get response stream.
using (Stream responseStream = response.GetResponseStream())
{
byte[] downloadBuffer = new byte[2048];
int bytesSize = 0;
// Download the file until the download is completed.
while (true)
{
// Read a buffer of data from the stream.
bytesSize = responseStream.Read(downloadBuffer, 0,
downloadBuffer.Length);
if (bytesSize == 0)
{
break;
}
// Write buffer to the file.
await fileStream.WriteAsync(downloadBuffer.AsBuffer());
}
}
}
}
}
catch (Exception ex)
{
result.Error=ex;
}
return result;
}
}
}
问题 XML文件的格式应如下所示:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<Table>
<Row>
<Month>JAN</Month>
<Year>1996</Year>
<RPI>74.6</RPI>
</Row>
<Row>
<Month>FEB</Month>
<Year>1996</Year>
<RPI>75.1</RPI>
</Row>
...
</Table>
但是,当我使用MS示例代码下载一个格式良好的小型XML文件时,结束标记总是被破坏,如下所示:
<Row>
<Month>APR</Month>
<Year>2013</Year>
<RPI>114.92</RPI>
</Row>
</Table>/RPI>
</Row>
<Row>
<Month>APR</Month>
<Year>2011</Year>
<RPI>111.33</RPI>
</Row>
<Row>
<Month>MAY</
这段代码来自微软自己的网站这个事实对我来说有点牵连。可能是FTP服务器上存在某些文件的情况吗?使用二进制传输模式下载Filezilla时没有问题。回顾以前的帖子我可以看到二进制与ASCII是一个问题,但WebRequest没有UseBinary属性(不像Windows 8中没有的FTPWebRequest)。
我已尝试过以下解决方法:
我认为我不应该进入这种明显不理想的工作环境。有谁知道问题可能在这里?谢谢。