-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 を生成するために適切な XML API を使用していないということです。それは単にテキストをばかげた方法で書き出すだけです。絶対にしないでください。XML を操作するときは、常にXML API を使用して、この種のことを処理してください。

クライアントでこれを修正する必要はありません。このデータを読み取るすべてのものが壊れたライターに対応する必要があるのはなぜですか? あなたがサーバー コードを制御しているのか (この場合は修正する必要があります)、それがサード パーティのコードであるのか (その場合は大声で叫ぶ必要があります) は明確ではありません。いずれにせよ、あからさまに XML ではないものを XML として宣伝するのは、単に悪い考えです。

于 2012-07-22T08:38:49.797 に答える