-2

Web API アプリを呼び出す Winforms アプリから正常に動作するこのコードがあります (XML ファイルをサーバーに正常にコピーします)。

public static string SendXMLFile(string xmlFilepath, string uri, int timeout)
{
    HttpWebRequest request = (HttpWebRequest)WebRequest.Create(uri);

    request.KeepAlive = false;
    request.ProtocolVersion = HttpVersion.Version10;
    request.ContentType = "application/xml";
    request.Method = "POST";

    StringBuilder sb = new StringBuilder();
    using (StreamReader sr = new StreamReader(xmlFilepath))
    {
        String line;
        while ((line = sr.ReadLine()) != null)
        {
            sb.AppendLine(line);
        }
        MessageBox.Show(sb.ToString());
        byte[] postBytes = Encoding.UTF8.GetBytes(sb.ToString());

        if (timeout < 0)
        {
            request.ReadWriteTimeout = timeout;
            request.Timeout = timeout;
        }

        request.ContentLength = postBytes.Length;

        try
        {
            Stream requestStream = request.GetRequestStream();

            requestStream.Write(postBytes, 0, postBytes.Length);
            requestStream.Close();

            HttpWebResponse response = null; //<= uncomment for older versions of .NET
            try
            {
                response = (HttpWebResponse)request.GetResponse(); //<= uncomment for older versions of .NET (comment out using)
            }
            finally
            {
                IDisposable disposableResponse = response as IDisposable;
                if (disposableResponse != null) disposableResponse.Dispose();
            }
        }
        catch (Exception ex)
        {
            MessageBox.Show(ex.Message);
            request.Abort();
            return string.Empty;
        }
    }
}

ただし、ハンドヘルド デバイスから同じサーバーに xml ファイルを送信しようとしたときに、この動作中のコードに可能な限り類似したコードが機能しない理由を突き止めようとすると、代わりに XmlTextReader を使用してみました (ここで提案されているように( 「ここでは XML のクラスとメソッドを使用していません」) で、それに関する私の苦労について詳しく説明します); 唯一の違いは、次の点です。

using (StreamReader sr = new StreamReader(xmlFilepath))
{
    String line;
    while ((line = sr.ReadLine()) != null)
    {
        sb.AppendLine(line);
    }
    MessageBox.Show(sb.ToString());
    byte[] postBytes = Encoding.UTF8.GetBytes(sb.ToString());

...作業中の(StreamReader)コードは次のように変更されました:

XmlTextReader reader = new XmlTextReader(xmlFilepath);
while (reader.Read())
{
    switch (reader.NodeType)
    {
        case XmlNodeType.Element: // The node is an Element.
            sb.Append("<" + reader.Name);

            while (reader.MoveToNextAttribute()) // Read attributes.
                sb.Append(" " + reader.Name + "='" + reader.Value + "'");
            sb.Append(">");
            sb.Append(">");
            break;
        case XmlNodeType.Text: //Display the text in each element.
            sb.Append(reader.Value);
            break;
        case XmlNodeType.EndElement: //Display end of element.
            sb.Append("</" + reader.Name);
            sb.Append(">");
            break;
    }
}

MessageBox.Show(sb.ToString());
byte[] postBytes = Encoding.UTF8.GetBytes(sb.ToString());

StreamReader コードを使用すると、読み取りデータはディスク上と同じように見えます。

ここに画像の説明を入力

ただし、XmlTextReader を使用すると、カバの群れに向けて大砲で撃たれたジャンバラヤのように、すべてごちゃ混ぜになります。

ここに画像の説明を入力

...そして、XmlTextReader バージョンが失敗し、「リモート サーバーがエラーを返しました: (500) 内部サーバー エラー。

そのため、StreamReader.ReadLine は XmlTextReader.Read よりも XML ファイルでうまく機能します。奇妙に思えます...私はここで何か間違ったことをしていますか?

4

1 に答える 1

2

デフォルトでは、XmlTextReaderは空白を無視します。空白を含めるように具体的に指示し、スイッチで空白の処理を開始する必要があります。

また、すべてのXmlReader実装は破棄可能であるため、 でラップすることに注意してくださいusing

XmlReaderSettings settings = new XmlReaderSettings();
settings.IgnoreWhitespace = false;
using(XmlReader reader = XmlReader.Create(xmlFilepath, settings)) {
    while (reader.Read())
    {
        switch (reader.NodeType)
        {
            case XmlNodeType.Element: // The node is an Element.
                sb.Append("<" + reader.Name);

                while (reader.MoveToNextAttribute()) // Read attributes.
                    sb.Append(" " + reader.Name + "='" + reader.Value + "'");
                sb.Append(">");
                sb.Append(">");
                break;
            case XmlNodeType.Text: 
            case XmlNodeType.Whitespace:
                sb.Append(reader.Value);
                break;
            case XmlNodeType.EndElement: //Display end of element.
                sb.Append("</" + reader.Name);
                sb.Append(">");
                break;
        }
    }
}
MessageBox.Show(sb.ToString());
byte[] postBytes = Encoding.UTF8.GetBytes(sb.ToString());
于 2014-08-29T02:27:25.497 に答える