Windows 8中的WebRequest破坏XML下载

时间:2013-05-29 14:44:08

标签: xml windows-8 download windows-store-apps webrequest

要点: 我正在使用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)。

我已尝试过以下解决方法:

  • 改变用于读取WebResponse的缓冲区大小并写入输出流 - 这具有移动损坏位置但不消除它的效果
  • 在每个读/写对之后将缓冲区重新初始化为新的byte []数组 - 无效
  • 将byte []缓冲区的值设置为0 - 这消除了对结束标记的损坏,但XML中的其他空白随机出现

我认为我不应该进入这种明显不理想的工作环境。有谁知道问题可能在这里?谢谢。

0 个答案:

没有答案