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 ファイルでうまく機能します。奇妙に思えます...私はここで何か間違ったことをしていますか?