У меня есть код, работающий с .NET 4.5.1:
private void button20_Click(object sender, EventArgs e)
{
String fullFilePath = @"C:\HoldingPattern\INV_0000003_20140818135513_1725.xml";
string justFileName = Path.GetFileNameWithoutExtension(fullFilePath);
String uri = String.Format("http://localhost:21608/api/inventory/sendXML/platypup/platypup/{0}", justFileName);
SendXMLFile(fullFilePath, uri, 500);
}
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();
}
finally
{
IDisposable disposableResponse = response as IDisposable;
if (disposableResponse != null) disposableResponse.Dispose();
}
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
request.Abort();
return string.Empty;
}
}
}
... но соответствующий код, ориентированный на .NET 1.1 и Compact Framework, измененный только по мере необходимости для компиляции, не работает (зависает)? Максимально приближенная версия SendXML () отличается только из-за этих сообщений об ошибках компилятора:
0) '*System.Net.HttpWebRequest' does not contain a definition for 'ReadWriteTimeout*'
1) '*System.Text.StringBuilder' does not contain a definition for 'AppendLine*'
Из-за них я закомментировал «request.ReadWriteTimeout = timeout;» и я изменил "sb.AppendLine (line);" в "sb.Append (строка);"
Другое отличие заключается в присвоении REST URI, который становится следующим:
String uri = String.Format("http://192.168.125.50:21608/api/inventory/sendXML/platypup/platypup/{0}", justFileName);
(разница в том, что вместо localhost используется IP-адрес, так как это необходимо для портативного устройства).
Что именно из этих незначительных отличий могло привести к его сбою? ... и многое другое, что мне нужно сделать, чтобы настроить его так, чтобы он заработал? Я предполагаю, что мне нужно имитировать вызовы StringBuilder.AppendLine () - знает ли кто-нибудь, каким именно образом это должно быть сделано, при условии, что это хорошая теория?
ОБНОВИТЬ
Примечание. Теперь я попытался добавить это в StringBuilder:
sb.Append("<data><![CDATA[");
... и добавив это:
sb.Append("]></data>");
... на основе ответа Андраса Золтана здесь, и я добираюсь дальше - он больше не зависает. Но я получаю исключение IOException ...
ОБНОВЛЕНИЕ 2
Я также пробовал добавить «новую строку» к StringBuilder вот так:
sb.Append("\r\n");
... но это не имело значения.
ОБНОВЛЕНИЕ 3
Также с этим кодом (который я получил по приведенной ниже ссылке tcarvin, за исключением того, что я использую версию кода .NET 1.1):
HttpWebRequest myHttpWebRequest=(HttpWebRequest)WebRequest.Create(uri);
myHttpWebRequest.AllowWriteStreamBuffering=false;
string postData = "Bla bla bla>"; // TODO: if this works, replace it with the real data
myHttpWebRequest.Method="POST";
ASCIIEncoding encodedData=new ASCIIEncoding();
byte[] byteArray=encodedData.GetBytes(postData);
myHttpWebRequest.ContentType="application/x-www-form-urlencoded";
myHttpWebRequest.ContentLength=byteArray.Length;
Stream newStream=myHttpWebRequest.GetRequestStream();
newStream.Write(byteArray,0,byteArray.Length);
newStream.Close();
HttpWebResponse myHttpWebResponse=(HttpWebResponse)myHttpWebRequest.GetResponse();
return myHttpWebResponse.StatusDescription;
... Я все еще получаю сообщение об ошибке "400 - неверный запрос".
ОБНОВЛЕНИЕ 4
Я увидел кое-что, что заставило меня подумать, что мне нужно добавить обратные удары к пути к файлу, поэтому я изменил этот код:
using (StreamReader sr = new StreamReader(xmlFilepath))
...к этому:
String s = String.Format("\\{0}", xmlFilepath);
using (StreamReader sr = new StreamReader(s))
... но я все еще "вознагражден" сообщением об ошибке "400 - Bad Request" с этим тоже ...
ОБНОВЛЕНИЕ 5
Изменение кода обновления 3 на этот:
UTF8Encoding encodedData = new UTF8Encoding();
//ASCIIEncoding encodedData=new ASCIIEncoding();
byte[] byteArray=encodedData.GetBytes(postData);
//myHttpWebRequest.ContentType="application/x-www-form-urlencoded";
myHttpWebRequest.ContentType = "application/xml";
... также не имеет значения - по-прежнему возвращается сообщение об ошибке "400 Bad Request".