Почему этот код не работает со старой / ограниченной версией .NET Framework (с минимально необходимыми настройками)?

У меня есть код, работающий с .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".


person B. Clay Shannon    schedule 02.09.2014    source источник
comment
Я не прошел третью строчку ... "C:" не существует на устройствах WinMo и WinCE.   -  person tcarvin    schedule 03.09.2014
comment
Хороший момент, но этого кода нет в коде компактной версии; это только в коде VS 2013; в компактном коде нет ссылки на C :.   -  person B. Clay Shannon    schedule 03.09.2014
comment
Существуют разные значения по умолчанию для настольной и компактной версии HttpWebRequest. Взгляните на это: msdn.microsoft.com/en-us/library/   -  person tcarvin    schedule 03.09.2014
comment
Обратите внимание на Обновление 3   -  person B. Clay Shannon    schedule 03.09.2014
comment
Я считаю это хорошим знаком, это означает, что вы общались достаточно правильно, чтобы сервер ответил осмысленным образом. Я ожидал бы 400 от веб-обработчика, если вы используете тип контента с URL-адресом формы, но отправляете ему нежелательные данные. Похоже, все работает как положено! У вас есть контроль над веб-стороной уравнения или это сторонняя сторона?   -  person tcarvin    schedule 03.09.2014
comment
Я тоже написал код веб-API (сервер). Однако он даже не достигает точки останова для конкретного метода; и Fiddler 2 показывает, что HTTP-трафик не отправляется ...   -  person B. Clay Shannon    schedule 03.09.2014
comment
Возможно, существует несоответствие типа контента, поскольку сервер ожидает XML, а в приведенном выше коде используется ASCIIEncoding. Я посмотрю, есть ли в наличии такая вещь, как XMLEncoding ... Хорошо, я пробую UTF8Encoding encodedData = new UTF8Encoding (); в настоящее время...   -  person B. Clay Shannon    schedule 03.09.2014