-1

我正在为游戏开发启动器/更新器。更新程序从服务器上的 xml 文件中获取数据。到目前为止,我的代码(其中有一些来自其他代码的引用)运行良好。我对其进行了测试,它下载的文件很好,但是,我用来测试它的文件是 jpg 的。启动器需要下载的实际文件是一系列字符,例如: (e}xP7,iIlM7Q8=&@vR2-sv~]9.5 下载这些文件时每次都会抛出异常。我对 C# 不是很好所以我想我会在我总能找到答案的地方寻求帮助。;)

我的 XML 示例:

<theupdates>

<update>
    <version>1.1</version>
    <file>(e}xP7,iIlM7Q8=&@vR2-sv~]9.5.$}t]8</file>
    <path>http://test.m-containers.com/Updates/</path>
  </update>

  <update>
    <version>1.1</version>
    <file>;V;xP,S]PXKr8;{(8HO2NJ H-g;PAo_yTuIV</file>
    <path>http://test.m-containers.com/Updates/</path>
  </update>

<update>
    <version>1.1</version>
    <file>^_HZpQ;Xpi{QS`Ku,}@#B}JYW}Q+;gdO0</file>
    <path>http://test.m-containers.com/Updates/</path>
  </update>

<update>
    <version>1.1</version>
    <file>{G'A4l7O8]~nb(a!mrK5hE)o</file>
    <path>http://test.m-containers.com/Updates/</path>
  </update>

</theupdates>

我的 C# 代码示例:

    string Root = AppDomain.CurrentDomain.BaseDirectory;

    XDocument serverXml = XDocument.Load(@"http://test.m-containers.com/Updates/Updates.xml");
    foreach (XElement update in serverXml.Descendants("update"))
    {
        string version = update.Element("version").Value;
        string file = update.Element("file").Value;
        string path = update.Element("path").Value;


        string sUrlToReadFileFrom = path + "V" + version + "/" + file;

        string sFilePathToWriteFileTo = Root + "\\Resource\\" + file;

        Uri url = new Uri(sUrlToReadFileFrom);
        System.Net.HttpWebRequest request = (System.Net.HttpWebRequest)System.Net.WebRequest.Create(url);
        System.Net.HttpWebResponse response = (System.Net.HttpWebResponse)request.GetResponse();
        response.Close();

        Int64 iSize = response.ContentLength;

        Int64 iRunningByteTotal = 0;

        using (System.Net.WebClient client = new System.Net.WebClient())
        {
            using (System.IO.Stream streamRemote = client.OpenRead(new Uri(sUrlToReadFileFrom)))
            {
                using (Stream streamLocal = new FileStream(sFilePathToWriteFileTo, FileMode.Create, FileAccess.Write, FileShare.None))
                {
                    int iByteSize = 0;
                    byte[] byteBuffer = new byte[iSize];
                    while ((iByteSize = streamRemote.Read(byteBuffer, 0, byteBuffer.Length)) > 0)
                    {
                        streamLocal.Write(byteBuffer, 0, iByteSize);
                        iRunningByteTotal += iByteSize;

                        double dIndex = (double)(iRunningByteTotal);
                        double dTotal = (double)byteBuffer.Length;
                        double dProgressPercentage = (dIndex / dTotal);
                        int iProgressPercentage = (int)(dProgressPercentage * 100);

                        Downloader.ReportProgress(iProgressPercentage);
                    }

                    streamLocal.Close();
                }

                streamRemote.Close();
            }
        }
    }

有没有办法让它,基本上,当它读到这些字符时不会发脾气,或者可能更合理,一个更好的方法来解决这个问题?

我感谢任何人可以提供的任何见解。

4

1 回答 1

1

有没有办法让它,基本上,当它读到这些字符时不会发脾气,或者可能更合理,一个更好的方法来解决这个问题?

是的。使其成为有效的 XML 文件。这不是有效的 XML:

<file>(e}xP7,iIlM7Q8=&@vR2-sv~]9.5.$}t]8</file>

&应该&amp;是。

我的猜测是服务器没有使用适当的 XML API 来生成 XML - 它只是以一种愚蠢的方式写出文本。永远不要那样做。操作 XML 时,请始终使用 XML API,以便它会为您处理此类事情。

不必在客户端上解决此问题 - 为什么读取此数据的所有内容都应容纳损坏的写入器?目前尚不清楚您是否在控制服务器代码(在这种情况下您应该修复它)或者它是否是第三方代码(在这种情况下您应该大声地对他们大喊大叫)。无论哪种方式,在公然不是 XML 的情况下将某些东西宣传为 XML 只是一个坏主意。

于 2012-07-22T08:38:49.797 回答